Моделирование отношений "один ко многим" в базе данных

Я пытаюсь найти подходящий шаблон для моделирования отношения «один ко многим» из нескольких таблиц в общую таблицу.

EntityA, EntityB and other entities have one or many GenericInfo.

  • EntityA (0..1) ------ (1..N) GenericInfo
  • EntityB (0..1) ------ (1..N) GenericInfo
  • EntityC (0..1) ------ (1..N) GenericInfo

    Option1: These entities are different so I cannot use a super table to model the relationships like

  • SuperEntity (S_Id pk)
  • EntityA (S_Id pk fk)
  • EntityB (S_Id pk fk)
  • GenericInfo (G_Id pk, S_id fk)


    Option2: And I don't want to lose referential integrity by removing the foreign key constrain from the GenericInfo table.

  • EntityA (S_Id pk fk)
  • EntityB (S_Id pk fk)
  • GenericInfo (G_Id pk, unique_id non-fk)


    Option3: I am currently using association tables for relationship mapping.

  • EntityA (A_Id pk)
  • EntityB (B_Id pk)
  • EntityAInfo(A_Id pk fk, G_Id pk fk)
  • EntityBInfo(B_Id pk fk, G_Id pk fk)
  • GenericInfo (G_Id pk)

    Мне не нравится это решение, потому что в базе данных должно быть создано слишком много таблиц, вся цель которых - сохранить ссылки / отношения.

    Option4: Another way I can think of is to create a mapping table with a single Id attribute like this,

  • EntityA (A_Id pk, I_id fk nullable)
  • EntityB (B_Id pk, I_id fk nullable)
  • InfoMapping(I_Id pk)
  • GenericInfo (G_Id pk, I_Id fk)

    Я хотел бы получить ваше экспертное мнение и вклад.

    Спасибо,

    Обновить

    Васек, спасибо за комментарий.

    Проблема, которую я пытаюсь решить, заключается в следующем: как установить объектно-реляционное сопоставление для реализации интерфейса, которая предоставляет коллекцию объектов?

    Мы используем одну стратегию таблицы для каждого класса для сопоставления OR. Таким образом, каждая таблица в примере отображается из класса. Допустим, у нас есть следующие определения типов и таблицы (жаль, что я не могу размещать здесь дисграммы)


    открытый интерфейс IGenericInfoProvider
    {
    GenericInfo [] GenericInfoArray {get; set;}
    }


    открытый класс BaseClassForA {} ------------------------------------------ --- Таблица BaseEntityForA
    открытый класс BaseClassForB {} ------------------------------------- -------- Таблица BaseEntityForB
    открытый класс ClassA: BaseClassForA, IGenericInfoProvider {} --- Таблица EntityA
    открытый класс ClassB: BaseClassForB, IGenericInfoProvider {} --- Таблица EntityB
    открытый класс GenericInfo {} ------------------------------------------------ ---- Таблица GenericInfo

    Я пытаюсь смоделировать отношения «один ко многим» между EntityA / EntityB и GenericInfo. Подобные отношения довольно часто встречаются в нашей модели предметной области.
    Option1 не считается, поскольку это приводит к созданию супертаблица, включающая все идентификаторы из множества таблиц, и это не имеет никакого смысла в мире объектно-ориентированных приложений.
    Option2 неприемлем из-за ссылочной целостности.
    Option3 - это шаблон, который я использую в настоящее время.
    Я рассматриваю Option4, но не уверен, это подход в правильном направлении.


  • person James Ye    schedule 13.06.2012    source источник


    Ответы (2)


    Я не уверен, чего вы хотите достичь, но я полагаю, что было бы полезно попробовать использовать какой-нибудь инструмент проектирования базы данных для создания структуры с таблицами, первичными / внешними / альтернативными ключами, составными ключами, отношениями и т. Д. тысячи слов :) и вы можете быстро создавать различные конструкции, генерировать код SQL и думать о том, как хранить образцы данных.

    Мне кажется, что первый сценарий (вариант 3) представляет отношения M: N. Второй сценарий (Вариант 4) представляет собой другой сценарий - разную ссылочную целостность, и поэтому два сценария несопоставимы.

    Попробуйте создать образцы баз данных, вставить образцы записей и написать запросы.

    person Vasek    schedule 15.06.2012

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

    person HLGEM    schedule 15.06.2012
    comment
    HLGEM, хороший ответ. Я обновил вопрос и хотел бы узнать ваше мнение о Варианте 4. Спасибо. - person James Ye; 15.06.2012