Что лучше - много маленьких столов или один большой стол? - PullRequest
36 голосов
/ 03 ноября 2010

У меня есть база данных, в которой будут храниться профили людей. Эти люди имеют около 50 возможных полей.

Некоторые распространенные вещи, такие как, имя, фамилия, адрес электронной почты, номер телефона.

Другие вещи, как хобби, навыки, интересы

Некоторые из них рост, вес, цвет кожи.

Каждая из этих групп используется системой в разное время. С точки зрения возможности согласования через базу данных, я бы предпочел иметь 7 таблиц в каждой из 8 полей. Что лучше всего делать?

РЕДАКТИРОВАТЬ: Данные будут использоваться в поисковой системе для поиска совпадений профиля. Это влияет на то, что я делаю?

Ответы [ 9 ]

33 голосов
/ 03 ноября 2010

Трудно сказать, и основано на том, что требует приложение.Я бы сказал, взглянуть на Нормализация базы данных , поскольку она покажет вам, как нормализовать базу данных и как она должна пролить свет на то, что вы хотели бы выделить в их собственные таблицы и т. Д.

25 голосов
/ 03 ноября 2010

Я из лагеря нормализации.

Вот несколько советов, с которых можно начать:

Начните с процесса назначения произвольного уникального идентификатора каждому «человеку».Назовите это PersonId или что-то в этом роде.Этот идентификатор называется суррогатным ключом.Единственная цель суррогатного ключа - гарантировать отношения 1: 1 между ним и реальным человеком в реальном мире.Используйте суррогатный ключ при сопоставлении значения какого-либо другого атрибута с «человеком» в вашей базе данных.

По мере разработки макета базы данных вы можете найти суррогатные ключи, необходимые (или, по крайней мере, полезные) для некоторых других атрибутов, например:ну.

Посмотрите на каждый атрибут, которым вы хотите управлять.Задайте следующий вопрос: есть ли у данного человека только одно значение для этого атрибута?

Например, у каждого человека есть ровно одна «Дата рождения».Но как они могут иметь «хобби»?Вероятно, ноль для многих.Однозначные атрибуты (например, дата рождения, рост, вес и т. Д.) Являются кандидатами для перехода в общую таблицу с ключом PersonId.На данный момент количество атрибутов в каждой таблице не должно вызывать беспокойства.

Многозначные атрибуты, такие как хобби, нуждаются в несколько ином подходе.Возможно, вы захотите создать отдельные таблицы для каждого многозначного атрибута.Используя хобби в качестве примера, вы можете создать следующую таблицу PersonHobby(PersonId, Hobby).Строка в этой таблице может выглядеть примерно так: (123, "Stamp Collecting").Таким образом, вы можете записать столько хобби, сколько требуется для каждого человека, по одному в строке.Сделайте то же самое для «Интереса», «Умения» и т. Д.

Если существует много многозначных атрибутов, в которых комбинация PersonId + Hobby больше ничего не определяет (т. Е. У вас нет ничего интересногочтобы записать, как этот человек делает это «Хобби», «Интерес» или «Умение»), вы можете объединить их в таблицу «Атрибут-Значение», имеющую структуру типа PersonAV(PersonId, AttributeName, Value).Здесь строка может выглядеть так: (123, "Hobby", "Stamp Collecting").

Если вы пойдете по этому пути, также будет хорошей идеей заменить AttributeName в таблице PersonAV суррогатным ключом и создать другую таблицу, чтобы связать этот ключ с его описанием.Что-то вроде: Attribute(AttributeId, AttributeName).Строка в этой таблице будет выглядеть примерно как (1, "Hobby"), а соответствующая строка PersonAV может быть (123, 1, "Stamp Collecting").Обычно это делается для того, чтобы, если вам когда-нибудь понадобится узнать, какие AttributeNames действительны в вашей базе данных / приложении, у вас есть место, чтобы найти их.Подумайте, как вы можете проверить, является ли «Интерес» действительным значением для AttributeName или нет - если вы не записали какое-либо лицо, имеющее этот AttributeName, то в вашей базе данных нет записи этого AttributeName - как это сделать?ты знаешь, должен ли он существовать или нет?Посмотрите в таблице Attribute

Некоторые атрибуты могут иметь несколько взаимосвязей, что также повлияет на нормализацию таблиц.Я не видел ни одной из этих зависимостей в вашем примере, поэтому рассмотрим следующее: Предположим, у нас есть склад, полный деталей, PartId определяет его WeightClass, StockCount и ShipCost.Это предполагает что-то вроде таблицы: Part(PartId, WeightClass, StockCount, ShipCost).Однако если существует связь между неключевыми атрибутами, то они должны быть учтены.Например, предположим, что WeightClass непосредственно определяет ShipCost.Это означает, что одного WeightClass достаточно для определения ShipCost, а ShipCost следует вычленить из таблицы Part.

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

Я призываю вас уделить немного времени изучению нормализации, прежде чем приступать к созданиюбаза данных.Несколько дней, проведенных здесь, более чем окупят себя в будущем.Попробуйте выполнить поиск в Google / Википедии на предмет «Функциональная зависимость», «Нормализация» и «Дизайн базы данных».Читайте, учитесь, учитесь, а затем постройте это правильно.

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

8 голосов
/ 03 ноября 2010

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

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

Таблица 1: PersonalDetails Таблица 2: Деятельность Таблица 3: Разное

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

6 голосов
/ 03 ноября 2010

ИМО, важнее беспокоиться о качестве хранимых данных, чем о количестве нужных вам таблиц.

Например, вам нужно отслеживать изменения?Если Джон был 5'2 "в январе 2007 года и 5'11" в октябре 2010 года, вы хотите знать?Если это так, вам нужно разделить человека с ростом на два стола.

Как насчет хобби - им разрешено иметь только 3 хобби?Могут ли они иметь больше / меньше?Это то, что вы хотели бы запросить в будущем?Если это так, вам нужна отдельная таблица.

Вы должны прочитать о дизайне и нормализации базы данных (на этом сайте есть несколько отличных тем).

https://stackoverflow.com/questions/tagged/normalization

6 голосов
/ 03 ноября 2010

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

5 голосов
/ 03 ноября 2010

Если у каждого человека нет одинакового количества хобби (то есть у каждого в списке 2 хобби), его следует нормализовать

Поля, которые всегда от 1 до 1 с человеком, должны быть в одной таблице. Возраст например. Ни у одного человека не будет двух разных возрастов.

3 голосов
/ 03 ноября 2010

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

3 голосов
/ 03 ноября 2010

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

Что бы я лично сделал, так это организовал бы ваши данные в логические сущности и создавал таблицы на основе этих сущностей. Это, по крайней мере, с чего бы я начал.

2 голосов
/ 03 ноября 2010

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

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