所以,我们有一个有趣的情况。我们应该在Linux下用C编写DBMS,我们有以下问题:当试图连接两个关系/表时,新的关系/表的字段/列数等于两个连接关系/表的和。这很好,但是当我们必须从两个连接关系/表中复制元组/行的数据时,我们似乎找不到一种方法。元组/行通过以下结构实现为列表元素:
typedef struct element {
void *data;
struct element *next;
} Element;新元素是通过以下函数创建的:
Element *
newElement (void *data)
{
Element *e = (Element*) malloc (sizeof (Element));
assert (e != NULL);
e->data = data;
e->next = NULL;
return e;
}并且*数据参数以这种类型传递:
typedef struct {
int sid;
char sname[STRLEN];
int rating;
float age;
} Sailor;问题是,当我们必须连接两个关系时,我们无法知道它们对其元组/行所使用的结构,因此我们不能从两个连接关系的元组/行中为新关系创建新的元组/行。
请帮帮忙。
发布于 2011-04-04 10:15:20
如果您不能在运行时定义新的结构,如下所示(hack?)可以工作..。
首先,定义一个只具有类型id的基结构。
typedef struct
{
int type_id; /* this holds a number which identifies the following structure */
} TypeID;
/* now all structures should contain this */
typedef struct {
TypeID type;
char sname[STRLEN];
int rating;
float age;
} Sailor;
typedef struct {
TypeID type;
char sname[STRLEN];
int sailors;
} Boat;现在将数据段视为这些结构的容器,例如,我将在数据中包含两个结构(即加入上述两个结构),我的数据段看起来如下:
----------
| Sailor |
+--------+
| Boat |
----------当读取数据块时,首先将其转换为TypeID,这给您提供了类型,然后您可以将其转换为真正的结构。然后,如果数据段中有更多的数据,按照刚才读取的结构的大小移动指针,然后再次执行相同的过程。基本上,这允许您有一个可变长度段,它是一组不同类型的结构--即连接的数据结构。
哦,您还需要修改Element结构以保存数据段的大小。
https://stackoverflow.com/questions/5536957
复制相似问题