2011-04-04 85 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