2013-05-21 5 views
4

Я пытаюсь построить схему SQL для системы, где у нас есть channels, каждый с id и один или несколько fixtures. Мне трудно найти способ реализовать это сопоставление «один ко многим». (то есть один channel для многих fixtures). Я использую H2 database engine.SQL one-to-many

Я не могу иметь таблицу:

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_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, который не имеет назначенных fixtures (Не идеально).

Мне было интересно, есть ли у вас какие-либо предложения по поводу того, как я могу подходить к этому (или где мое понимание неверно). Thanks

ответ

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

Спасибо за ваш ответ. Есть ли способ гарантировать, что «канал» как ** по крайней мере один ** «приспособление»? – ChrisSSocha

+2

@Chris Не в H2. Как бы вы создали «канал»? Сначала вам нужно создать «приспособление». Но вы не могли создать «приспособление», не создавая сначала «канал» ... То же самое для удаления записей. Некоторые базы данных поддерживают ограничения, которые проверяются при совершении транзакции, но не H2. –

0

Вы можете добавить CONSTRAINT, чтобы проверить это. Извините за отсутствие вставки фрагмента ... Я ничего не знаю о характеристиках H2.

Или вы также можете избежать концепции набора приборов. Тогда вам просто необходимо:

  • таблицу каналов, только с идентификатором (плюс другие поля, не участвующих в этом вопросе, конечно)
  • таблицы channelfixtures, с channelId и fixtureId. Первичный ключ будет состоять из (channelId, fixtureId)
  • таблица приборов, только если вам это нужно.
Смежные вопросы