Отношение одного типа к нескольким типам - PullRequest
2 голосов
/ 18 мая 2011

Представь, что я Марк Цукерберг, и сейчас 2003 год.

Я создаю сайт социальной сети (thefacebook.com), и мне нужен совет.

Акцент на сайте сделан на профилях пользователей, но он также поддерживает профили предприятий, университетов и т. Д. Мы называем эти другие профили - профили страниц.

Оба типа профилей (профили пользователей и профили страниц) поддерживают телефонные номера.

Как хранить эти номера телефонов в базе данных?

Имеет ли смысл следующий дизайн:

phones(phone_id, phone_number);
users_phones(user_id, phone_id, ...);
pages_phones(page_id, phone_id, ...);

Вы предлагаете альтернативный дизайн?

PS: Я полагаю, что мне нравится эта штука в Facebook, поэтому, участвуя в этом вопросе, вы можете принять участие в истории строительства.

Ответы [ 4 ]

4 голосов
/ 18 мая 2011

enter image description here

3 голосов
/ 18 мая 2011

Может быть:

users(user_id, phone_number, ...);
pages(page_id, phone_number, ...);

т.е. вы действительно заботитесь о телефонах как о существе?Или телефонный номер является просто полезным атрибутом пользователя и страницы?

Для нескольких телефонов на пользователя и на страницу:

users(user_id, ...);
pages(page_id, ...);
user_phones(user_id, phone_number);
page_phones(page_id, phone_number);
2 голосов
/ 18 мая 2011

Оба типа профилей (профили пользователей и профили страниц) поддерживают телефонные номера.

Как хранить эти телефонные номера в базе данных?

Inтаблица телефонных номеров профиля.

Подробнее об этом типе паттернов.И еще больше информации .

0 голосов
/ 18 мая 2011

Есть два понятия, которые смешиваются.

(1): вы работаете с несколькими похожими, но не совсем равными сущностями («профилями»), даже если у вас есть сущность по умолчанию или основнаяпрофиль.

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

http://en.wikipedia.org/wiki/Class_diagram#Generalization

profiletypes {profiletype_id, profiletype_name}

profile {profile_id, profiletype_id, profiletype_name}

profile_user {profile_id, profiletype_firstname, profiletype_lastname, profiletype_ssn, ...}

profile_company {profile_id, profiletype_companyname, ...}

profile_rockband {profile_id, profiletype_bandname, ...}

(2): у вас есть поле, которое можно повторить несколько раз, но по умолчанию оно есть.

Обычно;Я добавляю 1 или 2 номера телефонов по умолчанию к основному «профилю» / «таблице» и создаю дополнительную таблицу для телефонов.

profile {profile_id, profiletype_id, profiletype_name, profiletype_defaultphonenumber}

Телефоны {phone_id, profile_id, phone_number}

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