4

我正在尝试为我们拥有的系统构建一个 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_set需要UNIQUE

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

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没有fixture_set任何分配的 a fixtures(不理想)。

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

4

2 回答 2

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)
  );
于 2013-05-21T18:55:40.377 回答
0

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

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

  • 频道表,只有 id (当然还有其他不涉及该问题的字段)
  • 带有 channelId 和 fixtureId 的 channelfixtures 表。主键将由(channelId,fixtureId)组成
  • 固定台,仅在您需要时使用。
于 2013-05-21T18:43:32.283 回答