Как да съхранявате множество опции, избрани от потребителя в таблица

Затова искам потребителите ми да могат да ограничават кой може да се свързва с тях.

Има няколко фактора, които трябва да могат да филтрират, включително възраст (напр. трябва да е между 18 - 29), доход (трябва да печелят между $25 000 - $60 000), какво търсят (напр. приятелство, срещи и т.н.), какви наркотици употребяват (марихуана, метамфетамин, кокаин и т.н.) и т.н.

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

Например, как да съхраня реда на потребител, който за „наркотици“ е избрал „Марихуана“, „Кокаин“ и „Хероин“ в този контекст? Бих ли ги съхранявал просто като стойности, разделени със запетая, в колоната „Наркотици“? Или трябва да го направя по съвсем различен начин?

Какъв би бил най-добрият начин да направя това (като се има предвид, че очевидно ще трябва да извличам и проверявам тази информация всеки път, когато потребител иска да се свърже с друг потребител) и защо?


person ProgrammerGirl    schedule 22.09.2011    source източник


Отговори (3)


Не, не съхранявайте стойностите в CSV формат в базата данни. Вместо това създайте обединена таблица, наречена 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
person Mark Byers    schedule 22.09.2011
comment
интересно Но какво да кажем за основната таблица с всички ограничения, не само за лекарства (която е само една колона)? - person ProgrammerGirl; 22.09.2011
comment
Благодаря за редакцията, но все още съм объркан. Трябва да създам нова таблица с ОГРАНИЧЕНИЯ, която ще има колона за ограничението на всеки потребител. Тези колони ще включват възраст, доход, търсене, наркотици и т.н. Някои от тези колони (търся, наркотици и т.н.) може да съдържат множество възможности за избор. Все още не разбирам как да структурирам тази таблица ОГРАНИЧЕНИЯ по този начин. Съжалявам, че съм груб и наистина оценявам вашата помощ. - person ProgrammerGirl; 22.09.2011
comment
@Програмист: Ще ви трябва отделна таблица за свързване за всяка колона, която може да съдържа множество стойности. Въпреки че мисля, че само минималните и максималните стойности трябва да са достатъчни за възрастта и дохода. не си ли съгласен Изглежда малко странно да търсиш 21-30 или 41-50, но не и 31-40... - person Mark Byers; 22.09.2011
comment
Добре, така че имам нужда от таблица за свързване за всяка колона с множество избори. Схванах го. Виждам как сте структурирали например таблицата за присъединяване към user_drug, но как изглежда колоната за лекарства в таблицата RESTRICTIONS? (Никога не съм се занимавал с таблици за присъединяване) - person ProgrammerGirl; 22.09.2011
comment
В таблицата ОГРАНИЧЕНИЯ няма колона за лекарства. Всички стойности се съхраняват в таблицата за присъединяване. - person Mark Byers; 22.09.2011
comment
Добре, така че за да организирам всеки критерий за ограничаване на потребителите, ще трябва да създам таблица RESTRICTIONS за всеки единичен (не-множествен) критерий, но също така и допълнителни таблици за свързване за всеки критерий за множество, правилно ли е? Ако е така, това звучи доста сложно, защото всички критерии не са в една и съща таблица и извличането на всички потребителски критерии изглежда включва множество заявки. Това ли е най-добрият начин да го направите? Ако е така, ще тръгна по този път. - person ProgrammerGirl; 22.09.2011

Една колона от DB (поне теоретично) трябва НЕ да съдържа множество стойности. За съжаление, има някои програмисти, които съхраняват множество стойности в една колона (стойности, разделени със запетая за примери) - тези програмисти (в повечето случаи) разрушават концепцията за DB и SQL.

Предлагам ви да прочетете за Нормализиране на база данни, за да започнете да организирате вашите маси. И направете всичко възможно, за да постигнете Третата нормална форма на Код

person Tudor Constantin    schedule 22.09.2011

Можете да опитате с това:

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
person Dusan    schedule 22.09.2011
comment
Как имате две колони с едно и също име? - person ProgrammerGirl; 22.09.2011
comment
Това са стойности на enum ('AGE_MIN', 'AGE_MAX', 'INCOME_MIN', 'INCOME_MAX', 'DRUGS' ...), така че потребител с идентификатор 1 има критерий за наркотици 'Марихуана' и 'Мет'. - person Dusan; 22.09.2011
comment
Не съм запознат със стойностите на enum. Как бихте структурирали таблицата ОГРАНИЧЕНИЯ по този начин, като се има предвид, че някои стойности могат да имат множество възможности за избор (напр. лекарства, търсене и т.н.)? - person ProgrammerGirl; 22.09.2011
comment
Enum типове означава, че един запис в тази колона ще има само една стойност от enum списък. От множествен избор ще трябва да вмъкнете няколко записа (като последните два записа в моя пример). Може би това не е най-доброто решение, но е лесно за изпълнение и изисква само една таблица. - person Dusan; 22.09.2011