Дизайн базы данных: нужен составной ключ + внешний ключ - PullRequest
0 голосов
/ 01 июля 2011

У меня есть 2 таблицы с отношением 1-M:

TABLE foo
 - foo_id (PK)
 - foobar_id
 - value

TABLE bar
 - bar_id (PK)
 - foo_id (FK to foo.foo_id)
 - foobar_id
 - value

Я хочу убедиться, что foo.foobar_id и foo.value уникальны, и, следовательно, хочу сделать их составным ключом. Если я сделаю это, то, вероятно, смогу избавиться от foo.foo_id. И если я сделаю это, как мне соотнести foo и bar?

Я также хочу, чтобы bar.foo_id и bar.foobar_id были уникальными, но у меня возникнут проблемы, если я удалю foo.foo_id.

Предложения по моделированию этого?

Ответы [ 2 ]

1 голос
/ 01 июля 2011

Просто создайте уникальный индекс, который охватывает оба поля.В этом случае будут разрешены только уникальные пары.

0 голосов
/ 01 июля 2011

Я также хочу, чтобы bar.foo_id и bar.foobar_id были уникальными, но у меня возникнут проблемы, если я удалю foo.foo_id.

Вы можете иметь уникальные ключи, не будучи первичными ключами. Вы также можете иметь составные уникальные ключи или первичные ключи. Вы можете создать столько индексов, сколько захотите, для любого разнообразия, кроме основного.

Вы не столкнетесь с проблемами в том, что касается SQL, но вы можете столкнуться с людьми / кодом, которые уже используют эти таблицы.

А если я это сделаю, как мне соотнести foo и bar?

Похоже, у вас уже есть foobar_id в bar - вы можете сделать это внешним ключом foobar_id в foo.

Если это не сработает, вам может понадобиться сохранить foo_id в обоих случаях только для отношений. Это большая часть того, что идентификаторы для. К вашему сведению, если идентификатор является int, он занимает очень минимальное пространство, едва достаточное для беспокойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...