2011-04-04 57 views
0

所以,我们有一个有趣的情况。 我们应该在Linux下用C语言编写DBMS,我们遇到以下问题: 当试图连接两个关系/表时,新关系/表的字段/列数等于两个连接关系/表的总和。这很好,但是当我们必须从两个连接关系/表中复制元组/行的数据时,我们似乎找不到方法。元组/行被实现为通过该结构列表中的元素:将两个结构合并为一个新的C?

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; 

事情是当我们必须加入两个关系时,我们无法知道它们用于它们的元组/行的结构,因此我们无法为这个新的关系创建新的元组/行这两个连接关系的元组/行。

请帮忙。

+0

你正在用C编写一个DBMS?哇。请让我们知道它是如何发展的。 – 2011-04-04 10:06:42

+0

这是功课吗?如果是这样,请考虑标记为此。 – 2011-04-04 10:10:17

+0

我不知道如何DBMSs实现,但这里是我的2美分,可能你应该看一个表作为一个列的集合,其中每个列是一个数组,而不是每一行作为数据结构。这将包括一个新的列,就像分配一个新的指针一样简单。 – 2011-04-04 10:21:04

回答

1

鉴于你不能在运行时定义新的结构,类似如下(黑客?)可能工作..

首先定义一个基础结构,它只有一个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结构来保存数据段的大小。

+0

你会如何在运行时动态投射到某个结构体中?还是你的意思是在其中包含所有可能类型的switch case语句? – 2011-04-04 10:25:40

+0

@Adham,我没有说*动态转换*,我说* cast *转换为'TypeID',它给你类型(id),然后你需要转换为真正的类型(即使用'switch', 'if-else'无论什么都会让你看上!) – Nim 2011-04-04 10:28:46