【问题标题】:SQL one-to-manySQL 一对多
【发布时间】:2013-05-16 15:28:02
【问题描述】:

我正在尝试为我们拥有channels 的系统构建一个SQL 模式,每个系统都有一个id,以及一个或多个fixtures。我很难找到实现这种一对多映射的方法。 (即一个channel 到多个fixtures)。我正在使用H2 database engine

我不能有一张桌子:

 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
  );

...但这意味着我们可以有一个channel 和一个没有分配任何fixturesfixture_set(不理想)。

我想知道您是否对我如何处理这个问题有任何建议(或者我的理解有误)。谢谢

【问题讨论】:

    标签: sql database foreign-keys h2


    【解决方案1】:

    “一对多”表示多个项目(可能)引用一个项目。如果它是多个灯具的一个通道,那么灯具应该参考通道,而不是相反,这意味着参考列应该在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)
      );
    

    【讨论】:

    • 感谢您的回答。有什么方法可以保证channel 至少有一个 fixture
    • @Chris 不在 H2 中。您将如何创建channel?您首先必须创建一个fixture。但是如果不先创建channel,就无法创建fixture……删除条目也是如此。一些数据库支持在事务提交时检查的约束,但不支持 H2。
    【解决方案2】:

    您可以添加一个 CONSTRAINT 来检查它。 抱歉没有粘贴 sn-p...我对 H2 的细节一无所知。

    或者您也可以完全避免夹具组的概念。 那么你只需要:

    • 频道表,只有 id(当然还有其他未涉及的字段)
    • 一个带有 channelId 和 fixtureId 的 channelfixtures 表。主键由(channelId,fixtureId)组成
    • 夹具桌,仅在您需要时使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多