использовать объект последовательности для нескольких таблиц, чтобы обеспечить совместимость при объединении - PullRequest
1 голос
/ 13 марта 2011

Я использую Oracle.У меня есть две таблицы:

Кошка (cat_ID, cat_name, cat_age, cat_strength)

Собака (dog_ID, dog_name, dog_age)

Иногда мне нужно собрать всех питомцев в однурезультат запроса.Я думал о создании последовательности animal_seq, которая могла бы использоваться таблицами Cat и Dog, чтобы у них никогда не было повторяющихся идентификаторов в разных таблицах, а затем при объединении их можно было легко искать / запрашивать как угодно.

Это плохая практика?Если так, то почему?Существуют ли лучшие способы оформления таблиц (например, только одна таблица Animal или множественное наследование).Лично я стараюсь избегать наследования из-за проблем с производительностью соединений.

Ответы [ 3 ]

4 голосов
/ 13 марта 2011

Наличие единственной последовательности абсолютно приемлемо и безопасно. Oracle гарантирует, что многократное чтение последовательности всегда возвращает уникальное значение, поэтому у вас не должно возникнуть проблем с дублирующимися ключами.

Если схема между CAT и DOG действительно уникальна, а дополнительная сущность животного также будет уникальной, я бы оставил отдельные таблицы. Если вы собираетесь хранить ту же информацию о кошках, собаках, обезьянах и т. Д., Я бы порекомендовал поместить их в одну таблицу ЖИВОТНЫХ. Вам нужно будет предоставить больше информации о приложении / базе данных, чтобы мы знали, что порекомендовать.

1 голос
/ 13 марта 2011

Я думаю, что вы ищете базовый стол, animal. Тогда у вас есть два подкласса cat и dog. Такой дизайн поможет вам, когда вы добавите информацию, такую ​​как «владелец» этого животного, или «наблюдение за животными», или какова бы ни была цель вашего приложения.

table animal(
   animal_id 
  ,animal_type <-- Discriminator column with for example C for cat, D for dog 
  ,name
  ,age
  ,primary key(animal_id)
)

table cat(
   animal_id
  ,cat_strength
  ,primary key(animal_id)
  ,foreign key(animal_id) references animal(animal_id)
)

table dog(
   animal_id
  ,dog specific attributes here
  ,primary key(animal_id)
  ,foreign key(animal_id) references animal(animal_id)
)

Как видите, я переместил общие атрибуты в базовую таблицу animal, сохранив при этом конкретные атрибуты для подклассов в таблицах подклассов.

1 голос
/ 13 марта 2011

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

Я бы сказал, что использую принцип KISS (оставь его просто глупым) и имей одну таблицу и присоединяйся к другой таблице, называемой ANIMAL_TYPE (animal_type_id, Animal_type_name), чтобы вы могли убедиться, что идентификаторы не дублируются, и вы можете рассчитывать, если захотите запишите другие типы животных.

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