2013-05-21 29 views
4

我想爲我們有channels的系統建立一個SQL模式,每個系統都有一個id和一個或多個fixtures。我很難找到實現這種一對多映射的方法。 (即,一個channel到許多fixtures)。我正在使用H2 database engineSQL一對多

我不能有一個表:

id | fixture 
----|---------- 
    1 | 1 
    1 | 2 
    2 | 3 

CREATE TABLE channel(
    id INT NOT NULL PRIMARY KEY, 
    fixture INT NOT NULL 
); 

...爲PRIMARY KEYid必須是UNIQUE

同樣,我不能圖如下:

CREATE TABLE channel(
    id INT NOT NULL PRIMARY KEY, 
    f_set INT NOT NULL REFERENCES fixtures(f_set) 
); 

CREATE TABLE fixtures(
    id INT NOT NULL PRIMARY KEY, 
    f_set INT NOT NULL 
); 

...因爲這需要f_setUNIQUE

我目前正在實施它,如下所示:

CREATE TABLE channel(
    id INT NOT NULL PRIMARY KEY, 
    f_set INT NOT NULL REFERENCES fixture_set(id) 
); 

CREATE TABLE fixtures(
    id INT NOT NULL PRIMARY KEY, 
    f_set INT NOT NULL REFERENCES fixture_set(id) 
); 

CREATE TABLE fixture_set(
    id INT NOT NULL PRIMARY KEY 
); 

.. 。但是這意味着我們可以有一個channelfixture_set不具有任何分配fixtures(不理想)。

如果您有關於如何我可能接近這個(或在我的理解是錯誤的)任何建議,我想知道。由於

回答

11

「一對多」是指許多項目(可能)引用一個項目。如果它是一個通道,許多燈具,燈具則應該參考信道,而不是反過來,這意味着參考列應該是fixtures表:

CREATE TABLE channel(
    id INT NOT NULL PRIMARY KEY 
); 

CREATE TABLE fixtures(
    id INT NOT NULL PRIMARY KEY, 
    channel_id INT NOT NULL FOREIGN KEY REFERENCES channel (id) 
); 
+0

謝謝您的回答。有沒有辦法保證'channel'至少有一個**夾具? – ChrisSSocha

+2

@Chris不在H2中。你將如何創建一個「頻道」?你首先必須創建一個'fixture'。但是,如果不先創建「通道」,則無法創建「燈具」...同樣用於刪除條目。有些數據庫支持事務提交時檢查的約束,但不支持H2。 –

0

您可以添加約束只是爲了檢查它。 對不起,不粘貼的一個片段:我不知道具體H2什麼。

或者你也可避免固定器 - 集的概念都沒有。 那麼你就只需要:

  • 頻道表,只用ID(加上其他領域不涉及對那件事,當然)
  • 一個channelfixtures表,其中的channelID和fixtureId。主鍵將由(channelId,fixtureId)組成
  • 夾具表,只有在您需要時。