MIT6.5830 Lab1-GoDB实验记录(二) – WhiteNight's Site
接下来我们将完成tuple.go的缺失代码,并通过tuple_test.go的测试。
实验步骤
观察tuple.go
观察肯定是第一步,先打开tuple.go。
快300行代码,勉勉强强还在接受范围之内。接下来看看我们要做什么,首要目的肯定就是通过go test tuple_test.go。
实验步骤
分析数据结构
开头就给出了DBType的定义,tuple field?那我们暂且把它当作是元组字段–即每一行的每一个数据可以是什么类型的。说白了就是列的域(domain)是{int,string}。这里限定了存储在数据库中的数据只能是int或者string,对应了lab1.md中提到的“Data types except integers and fixed length strings.”。
// DBType is the type of a tuple field, in GoDB, e.g., IntType or StringType
type DBType int
const (
IntType DBType = iota
StringType DBType = iota
UnknownType DBType = iota //used internally, during parsing, because sometimes the type is unknown
)
var typeNames map[DBType]string = map[DBType]string{IntType: "int", StringType: "string"}
如果你不记得iota是啥了,这里有一个使用例:Golang中的iota。这里还新建了一个map,看起来是匹配int和string两种数据类型的。
接下来定义了一个FieldType结构。FieldType?字段类型又是什么玩意?
// FieldType is the type of a field in a tuple, e.g., its name, table, and [godb.DBType].
// TableQualifier may or may not be an emtpy string, depending on whether the table
// was specified in the query
type FieldType struct {
Fname string
TableQualifier string
Ftype DBType
}
先别着急。我们可以观察到,Ftype的类型是DBType。说明DBType对于FieldType而言是更加底层的方法。
上面的DBType,指向的是每一行的数据,它限定了每个元组中字段的类型。而FieldType指向的是每一列,它限定的是字段所构成的”元组“。举个例子
假设有个table,有四列,或者说是四个字段
id,name,email,address
如果id限定的类型为int,其他三者的类型为string。那么id的域就是{int},相当于Ftype=int;Fname就是“id”;那么tableQualifier,顾名思义,“表限定符”,指代的是数据库中的表。我们这里没碰到暂时就不管它。
还剩下最后一段:TupelDesc。
// TupleDesc is "type" of the tuple, e.g., the field names and types
type TupleDesc struct {
Fields []FieldType
}
Desc又是什么?不知道,又是没打注释。Descent?Describe?我们回到lab1.md中看看。
Tuples also have a type (or schema), called a tuple descriptor, represented by a TupleDesc struct, which consists of a collection of FieldType objects, one per field in the tuple, each of which describes the type of the corresponding field.
Fieids的类型是FieldType,说明TupleDesc要比FieldType更高级,它从FieldType继承了它的方法和数据类型。
总结一下,TupleDesc>FieldType>DBType。而TupleDesc存储着每一列字段的名字,类型。
那么接下来就是完成实验一了,下篇文章在慢慢记录。