簡體   English   中英

SQL一對多

[英]SQL one-to-many

我正在嘗試為一個我們有channels的系統構建一個SQL模式,每個channels都有一個id和一個或多個fixtures 我很難找到一種實現這種一對多映射的方法。 (即一個channel可連接許多fixtures )。 我正在使用H2數據庫引擎

我沒有桌子:

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

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

...,因為PRIMARY KEY id必須是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
  );

...但是這意味着我們可以擁有一個帶有fixture_setchannel ,該channel沒有任何分配的fixtures (不理想)。

我想知道您是否對我的處理方式(或我的理解錯誤的地方)有任何建議。 謝謝

“一對多”是指許多項目(可能)引用一個項目。 如果是多個燈具的一個通道,則燈具應參考通道,而不是相反的通道,這意味着參考列應在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)
  );

您可以添加CONSTRAINT只是為了檢查它。 很抱歉沒有粘貼代碼段...我對H2的具體信息一無所知。

或者,您也可以完全避免使用固定裝置的概念。 然后,您只需要:

  • 頻道表,僅包含ID(當然還有其他與此無關的字段)
  • 一個channelfixtures表,帶有channelId和FixtureId。 主鍵由(channelId,fixtureId)組成
  • 夾具表,僅在需要時使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM