2010-02-05 4 views
4

, у вас есть следующие многие-ко-многим таблицы соотношения:Многие ко многим дизайн базы данных вопрос

user 
----- 
id 
first_name 
last_name 

user_prefs 
---------------- 
id 
preference_name 

user2user_prefs 
------------- 
id 
user_id 
user_pref_id 

Но говорят, у вас есть предпочтения пользователя на «домашнюю страницу» и нужно где-то хранить фактическую домашнюю страницу URL-адрес. Где это будет?

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

Я могу поставить его в user2user_prefs так:

user2user_prefs 
------------- 
id 
user_id 
user_pref_id 
value 

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

Спасибо! Stabby L

ответ

3

Вы должны посмотреть на функциональные зависимости. Значение не зависит от пользователя, оно не зависит от userpref, но оно зависит от обоих. Это подразумевает, что вам нужно поместить его в tab2 пользователя user2user_prefs, как вы предложили.

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

+0

Это ответ я тайно надеясь на ... спасибо ;-) –

1

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

Вы нормализуете слишком далеко. Домашняя страница будет в порядке user_prefs.

В самом деле, если бы я тебя, я бы использовал только одну таблицу:

user 
----- 
id 
first_name 
last_name 
homepage 
<other settings> 

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

+0

Вы бы еще сказать, что если домашняя страница была только одна из тридцати различных пользовательских предпочтений? эта таблица была бы очень большой и плоской. –

+0

Нет ничего плохого в большом толстом столе. Вопрос в том, что добавляет много-много отношений? Чтобы помочь вам сбалансировать его, напишите два простых клиента, которые используют оба дизайна. Я думаю, что вы найдете опыт общения со многими отношениями, которые меняются друг с другом :) – Andomar

+0

Выгода, которую я искала с дизайном «многие ко многим», заключалась в том, чтобы иметь возможность контролировать и просматривать все различные пользовательские настройки в одна таблица (user_prefs). Мне нравится иметь эти параметры, определенные в одном месте, и по той же причине я использовал бы ENUM вместо VARCHAR для заранее определенных значений. На мой взгляд, это упрощает обслуживание кода. В моем исходном сообщении вы сможете запросить user_pref, чтобы просмотреть все параметры, доступные всем пользователям. Я понимаю, что все это в пользовательской таблице достигнет того же, и поэтому я спросил о нормализации ... –

1

Мне кажется, что особый тип значения на самом деле не относится к отношениям многих-многих. Если конкретное значение свойства специфично для каждого пользователя, то, похоже, это должна быть отдельная таблица. Он «чувствует», как будто бы было отношение 1-много от user к другой таблице, у которой есть предпочтения, уникальные для каждого пользователя.

Edit: Для 1 ко многим таблице:

user_specific_prefs 
------ 
id 
user_id 
pref_name (or possibly pref_id that indicates the type) 
pref_value (store www.myhome.com for example) 

user_id только внешний ключ обратно к конкретному пользователю. Это по существу (в логическом смысле) добавление дополнительных столбцов в пользовательскую таблицу. Но, как указывает Андомар, это добавляет сложности. Но если у вас есть огромное количество таких предпочтений, то может быть хорошим. С другой стороны, я видел таблицы с сотнями столбцов. Я не говорю, что это хорошо (и я их не создал), но они выполняют свою работу и просты в использовании.

+0

Это интересно, но я не уверен, что понимаю, что вы говорите. Любая надежда, что вы можете составить таблицы? –

+0

Спасибо за редактирование. Это было ближе к моей первоначальной настройке –

0

Вы очень близко.

[Изменить: Мой ранее считавшийся блестящим ответом был не таким блестящим.]

Отредактированные столы:

users 
----- 
id 
first_name 
last_name 
preferences 

Поле предпочтений будет держать упорядоченный объект или массив конкретных вариантов пользователей. В PHP:

if (is_array($options) || is_object($options)) 
     serialize($options); 

Serialize Manual

+0

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

+0

Вы правы. Цвет: красный, цвет: синий, цвет: оральный. Хммм –

Смежные вопросы