Нужен вклад в схему MySQL - PullRequest
0 голосов
/ 15 января 2010

Мне нужны некоторые данные о том, как мне структурировать свою БД.

Допустим, я хочу сохранить данные членов в таблице участников. Есть два типа участников, скажем, человек и организация. Лицо и организация имеют разный набор информации, поэтому мы должны хранить их в двух разных таблицах: скажем, люди и организации.

Я бы имел следующие таблицы:

Участники:

id
member_type_id
status
etc..

member_types:

id
type (person|organization|or any other type if needed)

человек:

id
name
etc

Организация:

id
name
etc

У меня вопрос: какой из лучших из следующих?

  1. Иметь member_id в таблицах лиц и организаций
  2. В таблице участников есть дополнительный столбец для хранения либо person_id, либо organization_id
  3. В таблице участников есть два дополнительных столбца для хранения person_id или organization_id, в зависимости от того, что применимо

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

Спасибо за ваш вклад.

Ответы [ 2 ]

1 голос
/ 15 января 2010

Обычно лучше вычленить ваши отношения, чтобы легче было понять, как связаны эти 2 сущности.Это позволит вам легко сказать, что это один-к-одному, многие-к-одному, один-ко-многим или многие-ко-многим и т. Д.

Это сказанное, как только вы поймете это, это тривиально для установки.

Если вы использовали Java или .Net, вы можете использовать Hibernate / NHibernate для автоматического создания таблиц для вас, указав отношения.

Вот как яразработал бы таблицы из того, что вы наметили: (Имейте в виду, что это соответствует схеме именования Java)

MemberType
id     (int11, auto increment, primary key)
name   (varchar31, unique)

One note about MemberType, if you're using Java and you will not dynamically add/remove member types, you should use an enum here.


Member
id    (int11, auto increment, primary key)
memberType_id (int11, on update cascade, on delete cascade)


Organization
id    (int11, auto increment, primary key)
name  (varchar31, unique)

-- Depends on how you want this structured (I would design it as a many-to-many relationship
MemberOrganization
member_id       (int11, on update cascade, on delete cascade, this links to the member id)
organization_id (int11, on update cascade, on delete cascade, this links to the organization id)

Чтобы получить список всех членов конкретной организации ...

SELECT
 *
FROM
 Organization o
 INNER JOIN MemberOrganization mo ON mo.organization_id = o.id
 INNER JOIN Member m ON m.id = mo.member_id
WHERE
 o.name = 'StackOverFlow.com'

Посмотрев на ваш вопрос еще раз, я думаю, что вы ищете другой ответ.

Уолтер

0 голосов
/ 15 января 2010

Вы также можете сделать это:

Участник Я бы название статус

Персона (расширяет член) id (ссылки на идентификатор участника)

Организация (расширяет член) ID

посетителей Я бы Дата member_id (опять же, это ссылка на таблицу участников, вам нужно будет выполнить внешнее объединение, чтобы получить фактические данные участника, будь то человек или организация)

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

Дайте мне знать, если это поможет.

Кроме того, используете ли вы PHP, Java и т. Д., И можете ли вы предоставить дополнительную справочную информацию о том, что вам нужно или вы используете это для? Может быть лучший дизайн стола, который сильно отличается от этого.

Как я уже сказал, существуют инструменты, которые автоматизируют этот процесс для вас, чтобы вы не беспокоились о деталях низкого уровня. Конечно, вам нужно понять отношения еще до того, как использовать инструменты, иначе вам не будет лучше. Их хорошо понимать, но инструменты оптимизированы для 90% того, что вам нужно.

Walter

...