2010-11-24 1 views
1

У меня есть сайт с пользователями, которые я хочу, чтобы пользователи могли идентифицировать свои этнические группы. Каков наилучший способ моделировать это, если существует только один уровень иерархии?Моделирование данных: этнические группы с отношениями между родителями и детьми?

Решение 1 (одна таблица):

Ethnicity 
- Id 
- Parent Id 
- Name 

Решение 2 (две таблицы):

Ethnicity Group 
- Id 
- Name 

Ethnicity 
- Id 
- Ethnicity Group Id 
- Name 

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

+1

Если существует только один уровень иерархии, как может быть EthnicityGroup? – 2010-11-24 01:32:41

ответ

1

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

Если вы делаете это правильно, как в реальном мире, эта проблема устранена. Дайте мне знать, хотите ли вы Race, и я изменю модель.

Таблицы слишком малы, а клавиши слишком значимы, чтобы добавить к ним столбцы Id-iot; оставьте их в качестве чистых реляционных ключей, иначе вы потеряете мощность реляционного движка. Если вам действительно нужны узкие клавиши, используйте код Этнического кода CHAR (2), а не ЧИСЛЕННЫЙ (10,0) или бессмысленный номер.

Link to Ethnicity Data Model (плюс ответ на другой вопрос)

Link to IDEF1X Notation для тех, кто не знаком с реляционными моделирования стандарта.

+0

@SONewbie. Благодарю. Вы не ответили, хотите ли вы гонки (3 уровня) или 2 уровня. – PerformanceDBA 2010-11-27 15:57:22

0

Если в реальном мире нет ничего похожего на «группу этнических групп», я бы посоветовал вам не вводить ее в вашей модели данных.

Все запросы, которые вы можете сделать со вторым, вы также можете сделать с первым, потому что вы можете просто выбрать FROM ethnicity AS e1 JOIN ethnicity AS es ON (e2.ethnicity_id = e1.parent_id).

+0

«Азиатский» - это группа, «японская» - это фактическая этническая принадлежность ??? – StackOverflowNewbie 2010-11-24 06:18:40

+1

Я никогда не слышал, чтобы кто-то говорил «люди азиатской группы этнических групп», но в этом случае продолжайте и создайте таблицу «Группа этнической принадлежности». Ваша структура базы данных должна моделировать реальность. – AndreKR 2010-11-24 13:35:25

0

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