Нужна помощь с дизайном таблицы базы данных - PullRequest
0 голосов
/ 26 марта 2011
CREATE TABLE MemberProfile
(
   memberID, 
   memberTypeID,
   aboutMeID,
   memberRegID,
   memberProfileSettingsID,
   lastLogin datetime,
   PRIMARY KEY(memberID)
)
  • memberTypeID представляет Базового участника, Золотого участника, Серебряного участника и т. Д.

  • aboutMeID представляет сообщение / тему, которая будет рассказывать людям об этом пользователе. У каждого пользователя будет страница Обо мне. Атрибуты: заголовок, тело и т. Д.

  • memberRegID представляет имя пользователя, пароль, электронную почту, уведомление о получении, isActive и т. Д.

  • memberProfileSettingsID представляет параметры, такие как скрыть список избранных, скрыть возраст и т. Д.

Это хороший дизайн? Я не хотел помещать все поля в одну таблицу "MemberProfile".

Ответы [ 2 ]

0 голосов
/ 26 марта 2011

Похоже, у вас есть обязательное отношение 1: 1 к MemberID и всем атрибутам, что означает, что вы можете хранить их все в одной таблице (memberprofile).Это значительно облегчит кодирование.

Знайте, что трудно обеспечить истинные отношения 1: 1, но это можно сделать с помощью триггеров.Посмотрите на вопросы с тегом [database-design].Есть два недавних вопроса об отношениях 1: 1.

У меня есть некоторые комментарии к идентификаторам.Если вы используете дополнительные таблицы для параметров участника, информации для входа и т. Д., Вам следует удалить ключи из MemberProfile и вместо этого использовать MemberID в этих таблицах, ссылаясь на MemberProfile с внешним ключом.Это позволит вам использовать эти таблицы напрямую, без присоединения к memberprofile.

Примерно так:

create table memberprofile(
   member_id
  ,membertype_id
  ,primary key(member_id)
  ,foreign key(membertype_id) references membertype(membertype_id)
);

create table profile_settings(
   member_id
  ,some_setting
  ,other_setting
  ,primary key(member_id)
  ,foreign key(member_id) references memberprofile(member_id)
);

Теперь, когда я думаю об этом, я думаю, что AboutMeID не 1: 1.Вы имеете в виду ссылку на сообщение на форуме, сделанное пользователем, чтобы представиться?В этом случае это будет 1: 0 кардинальности, потому что вам обычно нужно зарегистрироваться перед созданием сообщения:)
Вы можете реализовать это как столбец NULLable в MemberProfile или как отдельную таблицу с member_id в качестве первичного ключа и идентификаторасообщения форума.Если вы ожидаете, что большинство строк в итоге получат значение, я бы лично выбрал столбец, который можно обнулять.

Использовать ли одну или несколько таблиц для ваших (1: 1) атрибутов - выбор реализации.В зависимости от ваших шаблонов запросов, это может повлиять на производительность, хорошую или плохую.

0 голосов
/ 26 марта 2011

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

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

...