Как разрешить и сохранить подопции в базе данных

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

Я, конечно, использую базу данных, и в настоящее время она настроена с таблицей для пакетов и таблицей для заказов. В таблице заказов есть столбец, содержащий список идентификаторов пакетов, который ссылается на записи, хранящиеся в таблице «пакеты».

Прямо сейчас я думаю, что лучший способ сделать это — добавить еще один столбец в таблицу назначений, который будет содержать подпараметры, в форме:

packageid:optionid;package2id:option2id

А также еще один столбец в таблице пакетов, который имеет параметры в виде:

1:red,2:blue,3:green //for options with no add'l price
1:large[$20],2:medium[$15],3:small[$10] //for options that change the price

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


person Ashley Strout    schedule 22.06.2012    source источник
comment
Почему бы не иметь таблицу пакетов? Вы можете связать это с таблицей бронирования с помощью внешнего ключа, ссылающегося на bookings. Это позволит вам хранить произвольное количество данных, не беспокоясь о нехватке места при увеличении количества пакетов.   -  person andrewsi    schedule 23.06.2012


Ответы (4)


Если у вас есть переменное количество вариантов, как кажется, вы делаете следующее:

Создайте таблицу, связывающую пакеты и опции по идентификаторам. Таким образом, у вас будут таблицы packages и options, а затем у вас будет таблица package_options, которая будет иметь только (помимо ее идентификатора и любого времени создания/модификации, которое вы храните) package_id и option_id.

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

person Eric H    schedule 22.06.2012
comment
Да, но мне кажется, что это не распространяется на то, как я буду хранить параметры, выбранные для каждого пакета в строках встреч. У меня нет недостатка в идеях, как хранить параметры для каждого пакета, как затем связать их с каждой встречей, когда их выбирает конечный пользователь. - person Ashley Strout; 20.08.2012
comment
Если я правильно вас понял, кажется, вам просто нужна еще одна таблица для связывания опций, пакетов и встреч. В этом случае у вас будет таблица со строками, похожими на appointment_id, package_id и option_id. Затем вы должны были присоединиться к четырем столам, чтобы узнать, какая встреча запросила, какие пакеты и какие подопции. Я надеюсь, что это ясно. Я чувствую, что могу неправильно понять ваш вопрос. - person Eric H; 25.08.2012
comment
ну, вы создаете столбец в конце опции, которая ссылается на родителя, а затем просто используете соединение, чтобы связать друг с другом, если вы понимаете мой дрейф. - person Breezer; 25.08.2012

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

Составьте такую ​​таблицу:

ID, PackageName, OptionName
1,  Balloons, Red Balloons
2,  Balloons, Blue Balloons
3,  Pizza, Plain
4,  Pizza, Pepperoni
5,  Clown, NULL

Затем, когда вам понадобится список пакетов для выбора, вы можете ВЫБРАТЬ PackageName из tblPackages GROUP BY PackageName. После того, как пользователь выберет пакет, вы можете выбрать SELECT OptionName из tblPackges, где PackageName = 1;

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

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

Надеюсь, поможет.

person Cargo23    schedule 24.08.2012

Начните с перечисления объектов, которые вы хотите сохранить, и отношений между ними. Судя по вашему описанию, у вас есть 3 сущности, участвующие в сохранении встречи:

  1. встречи
  2. выбранные пакеты
  3. выбранные параметры

С 2 отношениями:

  1. у каждой встречи может быть любое количество пакетов
  2. каждый пакет любое количество опций

Сущности — это ваши основные таблицы, а отношения между ними — это внешние ключи:

  • Назначения за столом (Id Int, детали встречи...)
  • Таблица selected_packages (Id Int, назначение_id Int, сведения о пакете...)
  • Таблица selected_options ( selected_package_id Int, подробности опции... )

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

person IMSoP    schedule 25.08.2012

Вы не говорите, какой тип базы данных вы используете (кроме упоминания таблицы в объяснении).

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

В противном случае просто игнорируйте мой комментарий и читайте другие. Я предполагаю, что вам понадобятся две отдельные таблицы, соединенные SQL join друг с другом.

person Otar    schedule 28.08.2012
comment
Что в этом сценарии заставляет вас предположить, что решение без схемы было бы более подходящим, чем реляционное проектирование? - person IMSoP; 29.08.2012