2011-09-22 3 views
1

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

Существует несколько факторов, которые они должны фильтровать, включая возраст (например, должно быть от 18 до 29 лет), доход (должен зарабатывать от 25 000 до 60 000 долларов США), что они ищут (например, «Дружба», «Повесьте», и т. д.), какие наркотики они делают (марихуана, мет, кокаин и т. д.) и т. д.

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

Например, как я могу хранить строку пользователя, которая для «наркотиков» выбрала «марихуана», «кокаин» и «героин» в этом контексте? Я бы просто сохранил их как значения, разделенные запятыми, в столбце «Drugs»? Или я должен делать это совершенно по-другому?

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

ответ

3

Нет, не сохраняйте значения в формате CSV в базе данных. Вместо того, чтобы создать join table называется user_drug и хранить одну строку для каждой комбинации пользователя/наркотиков:

user 
id name income 
1  Foo 10000 
2  Bar 20000 
3  Baz 30000 

drug 
id name 
1  Marijuana 
2  Cocaine 
3  Heroin 

user_drug 
user_id drug_id 
1  1 
1  2 
2  1  
2  3 
3  3 
+0

Интересно. Но как насчет главной таблицы со всеми ограничениями, а не только с наркотиками (это всего лишь одна колонка)? – ProgrammerGirl

+0

Спасибо за редактирование, но я все еще смущен. Мне нужно создать новую таблицу ОГРАНИЧЕНИЙ, которая будет иметь столбец для ограничения каждого пользователя. Эти столбцы будут включать возраст, доход, поиск, наркотики и т. Д. Некоторые из этих столбцов (поиск, наркотики и т. Д.) Могут содержать несколько вариантов. Я до сих пор не понимаю, как структурировать эту таблицу ОГРАНИЧЕНИЯ. Извините, я плотный, и я очень ценю вашу помощь. – ProgrammerGirl

+0

@Programmer: вам понадобится отдельная таблица соединений для каждого столбца, который может содержать несколько значений. Хотя я думаю, что минимальные и максимальные значения должны быть достаточными для возраста и дохода. Вы не согласны? Кажется немного странным искать 21-30 или 41-50, но не 31-40 ... –

0

Вы можете попробовать с этим:

criterium 
------------ 
user_id type   value 
1  AGE_MIN  18 
1  AGE_MAX  29 
1  INCOME_MIN 25000 
1  INCOME_MAX 60000 
1  DRUGS   Marijuana 
1  DRUGS   Meth 
+0

Как у вас есть два столбца с одинаковым именем? – ProgrammerGirl

+0

Это значения перечисления ('AGE_MIN', 'AGE_MAX', 'INCOME_MIN', 'INCOME_MAX', 'DRUGS' ...), поэтому пользователь с идентификатором 1 имеет критерий для марихуаны наркотиков и «Meth». – Dusan

+0

Я не знаком с «значениями перечисления». Как бы вы структурировали таблицу ОГРАНИЧЕНИЙ таким образом, учитывая, что некоторые значения могут иметь несколько вариантов (например, наркотики, поиск и т. Д.)? – ProgrammerGirl

1

БД столбец (по крайней мере, theorethically) должна НЕ держать несколько значений. К сожалению, есть некоторые программисты, которые хранят несколько значений в одном столбце (значения, разделенные запятой для примеров) - эти программисты (в большинстве случаев) разрушают концепцию БД и SQL.

Предлагаю вам прочитать о Database Normalization, чтобы начать работу по организации ваших столов. И сделайте все возможное, чтобы достичь Codd's Third Normal Form

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