2016-04-13 4 views
-1

Это моя первая публикация при переполнении стека. У меня много проблем, моделируя следующую ситуацию. Надеюсь на какую-то помощь.Дизайн таблицы базы данных (Пользователь, Получатель, Адрес)

Вот бизнес-правила:

  • Пользователь имеет 0..1 для многих отношениях с реципиентом (например: пользователь может иметь ноль или несколько получателей)
  • Пользователь имеет 0..1 для многих отношений с адресом (например, пользователь может иметь ноль или несколько адресов)
  • получателя имеет 1 к 1 отношения с адресом (например, получатель должен иметь адрес)

Это то, что я так далеко:

  • пользователя (UserID PK)
  • Получатель (RecipientID PK, Идентификатор_пользователя NOT NULL FK, AddressID NOT NULL FK)
  • Адрес (AddressID PK, Идентификатор_пользователя NULL FK)

Что действительно беспокоит я в том, что UserID в таблице Address должен иметь значение NULL, и я не вижу никакого способа обойти его.

Благодарим за любую помощь заранее.

+1

Если использование rID может быть недействительным, тогда он не должен иметь отношения к таблице адресов. Вы можете использовать сводную таблицу, которая будет содержать отношения. Ex. UserAddressTable: ID, AddressID, UserID – mehany

ответ

0

Это потому, что вы построили свой дизайн с «User» в качестве основного объекта, но сценарий здесь требуется «Адрес» к основной сущности, так

Address (Aid PK) 
Recipient (Rid PK, Aid not null FK) 
User (Uid PK, Rid FK, Aid FK) 

или

User (Uid, Rid, Aid) composite PK 
+0

, это просто переместит проблему нулевого внешнего ключа из таблицы адресов в таблицу пользователя. –

0

Как пишет mehany в своем комментарии, вы можете добавить таблицу отношений между пользователями и адресами:

UserAddresses 
(
    AddressId, -- FK to Address, UNIQUE. 
    UserId -- FK to User 
) 
+0

Я думал то же самое, но не мог бы заставить Пользователя и Обратиться ко многим ко многим отношениям ... и это нормально? Спасибо. – easypay

+0

Я думаю, что создание уникального идентификатора пользователя не приведет к тому, что у пользователя будет 0..1 для многих отношений с адресом ... возможно, ваш адрес AddressID будет уникальным? Извините, если я не знаю об этом. – easypay

+0

Правильно, AddressId должен быть уникальным, извините, моя ошибка. –