Смоделируйте отношения «ноль» или «один ко многим» - PullRequest
3 голосов
/ 27 марта 2010

Как мне смоделировать отношение ноль или один ко многим в базе данных? Например, запись пользователя может иметь или не иметь родителя. Так должна ли моя пользовательская таблица иметь t_user.parent_id или у меня должна быть ассоциативная таблица с именем t_user_hierarchy со столбцами t_user_hierarchy.parent_id и t_user_hierarchy.user_id?

Ответы [ 5 ]

2 голосов
/ 19 октября 2012

1NF не предусматривает пустых столбцов. Поэтому, чтобы реализовать отношение «ноль-к-одному», поместите внешний ключ в дочерний элемент (предполагая, что это таблица, которая может иметь или не иметь запись, относящуюся к родительскому элементу), которая указывает на родительский элемент. Затем используйте запрос внешнего соединения от родителя к потомку, чтобы получить случаи, когда есть родители с детьми и без детей.

Пример:

Customer Table (i.e., parent)
   CID (Primary Key)
   Customer_Name
   Customer_Address
   ...

Order Table (i.e., child)
   OID (Primary Key)
   Ordered_Date
   Order_Quantity
   ... (product ordered would be a foreign key to the Products table; not relevant to discussion)
   CID (Foreign Key to Customer table)

SQL:
   SELECT Customer.Customer_Name, Order.Ordered_Date, Order.Order_Quantity 
   FROM Customer 
   LEFT OUTER JOIN Order 
   ON Customer.CID = Order.CID (syntax generic)

Это вернет ВСЕ записи клиентов и свяжет ЛЮБОЙ сделанный заказ. Также будут возвращены клиенты, у которых не было заказов.

2 голосов
/ 27 марта 2010

Посмотри на эту тему. Аналогичная проблема: Какой-нибудь пример необходимого внешнего ключа, который может иметь значение Nullable?

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

0 голосов
/ 27 марта 2010

Отношение ноль или один ко многим в базе данных обычно представляется объявлением поля, в вашем случае Parent_ID , а затем резервированием значения для его обозначения, указывающего на ничто.

Поскольку реляционные базы данных (RDBMS) обычно позволяют иметь значения NULL, вы можете использовать значение NULL, чтобы отметить конкретную запись, не имеющую родителя.

Create Table T_USER (
    User_ID     Number(9) NOT NULL ,
    Parent_ID   Number(9)
)

Приведенный выше пример относится к СУБД Oracle, но идея аналогична и в других базах данных. В качестве альтернативы вы могли бы специально пометить базу данных полем, в котором указано это, но обычно это является перегрузкой, поскольку большинство систем баз данных могут обрабатывать особый случай NULL без добавления дополнительного поля.

0 голосов
/ 27 марта 2010

Я бы пошел с обнуляемым родительским идентификатором. Затем вы можете просто использовать самостоятельные объединения, чтобы получить родительские или дочерние элементы какой-либо конкретной записи.

0 голосов
/ 27 марта 2010

Просто сделайте внешний ключ в дочерней таблице (пользовательская таблица?) Обнуляемым

...