Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > MySQL > Построение структуры базы данных |
Автор: korob2001 23.9.2015, 22:17 |
Привет всем! Дали задание написать интернет магазин для продажи электрических скутеров, запчастей для них, а так же различных аксессуаров (шлемы, перчатки и т.д). Первое, что пришло в голову, создать, старые - добрые таблички: products и categories. Уже даже почти всё сделал, но всё же сходил к заказчику для выяснения всех деталей, да бы добиться от него внятного ответа на вопрос: Чего он хочет? В общем, такой вариант не прокатил, так как описание самого скутера должно быть максимально детализовано, т.е. нельзя всю информацию поместить в одно поле типа products.description, нужно сделать так, что бы всё, что касается скутера, хранилось в отдельных таблицах и/или полях. Тоже самое касается и запчастей, так как их поиск должен осуществляться не только по марке и/или модели скутера, а так же и по VIN номеру конкретного скутера. Единственное, что пришло в голову, разбить все эти товары (скутеры, запчасти и аксессуары) на отдельные таблицы. Начал рисовать в Workbench ещё одну БД. Почти нарисовал, пока не дошёл до таблицы categories и врубился, что она мне теперь не слишком-то и нужна, потому как, по сути, у меня теперь каждая категория хранится в отдельной таблице (vehicles, parts, accessoires), так же возникли трудности с таблицей orders, фактически пришлось создавать для каждой из этих трёх таблиц, свою таблицу orders. В общем меня постоянно не покидает чувство, что иду я куда-то, не туда. ;(((( PS: Я не прошу готовое решение, мне нужно просто указать направление. Если, что-то не понятно описал, дайте знать я опишу более подробно, просто не стал описывать изначально все таблицы их у меня получилось около 40-ка. |
Автор: r00tGER 24.9.2015, 08:49 | ||
Ок, только путь будет не близким (судя, по вашим действиям). Берёте толстую книгу по реляционной алгебре, потом толстую книгу по СУБД. Либо, надо избавиться от "чувство, что иду я куда-то, не туда" и продолжать, как получается - этот пункт приведет либо к первому, либо к последнему. Самый лучший вариант, если это задание было разовым и больше не будете проектировать БД - отдать его на выполнение тому, кто уже это делал. Без обид, вовсе не хочу выпендреться. Но, когда задают такие вопросы в контексте реальной взрослой задачи - то хочется убедить, что надо сначала "прокачаться". Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Postroyeniye-struktury-bazy-dannykh-id5602faebae201513228b4567#findElement_E7045_56038eddae20150733b9cee1_0 |
Автор: Akina 24.9.2015, 09:06 |
В данном конкретном случае связь экземпляров сущностей "товар" является самым что ни на есть вульгарным деревом. Поскольку требуются такие операции с деревом, как выбор всей ветки экземпляров от родителя вниз по экземпляру и копирование ветки - лучше использовать именно tree-ориентированные структуры хранения данных, типа nested set. Хотя можно обойтись и вульгарным parent-child. Поскольку отдельные экземпляры сущностей имеют множественные атрибуты и неоднородны, в части описания атрибутов экземпляра разумно посмотреть в сторону EAV. Хотя опять же можно обойтись и нормализованной сериализацией. |
Автор: Akina 25.9.2015, 08:30 | ||
Вовсе необязательно. Можно обойтись и одной таблицей, в которой есть поля нескольких типов, причём заполняются только совместимые для данного значения, а остальные NULL. А можно обойтись и одним текстовым - всё равно типизация в MySQL слабенькая, почти никакая, а неявное приведение возведено в ранг абсолюта. |
Автор: jsharp36 25.9.2015, 09:15 |
Всё нормально, вы идете туда куда надо. Вы в базе данных сейчас опытным путем нащупали, как реализовать то, что в ООП языках называется наследованием. В данном случае только данных. Т.е. есть таблица, в которой обраны общие поля (базовый класс), и есть таблицы для конкретных типов товаров, которые расширяют базовый тип и имеют колонки, свойственные только этому типу. Никаких EAV. Пока оно не нужно и очень вредно. Вы всё правильно делаете. Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Postroyeniye-struktury-bazy-dannykh-id5602faebae201513228b4567#findElement_E7045_5604e69cae20153a6ab9cc54_0 |
Автор: jsharp36 25.9.2015, 09:17 |
Единственное, смотрите сами по сложности и не увлекайтесь слишком нормализацией. Например, смысла нет для только скутера конкретной модели завести отдельную таблицу. Иногда лучше денормализовать таблицу. Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Postroyeniye-struktury-bazy-dannykh-id5602faebae201513228b4567#findElement_E7045_5604e70eae2015135fb9ce42_0 |
Автор: korob2001 27.9.2015, 06:02 | ||||
Привет всем, ещё раз!
Мне почему-то кажется, что именно ООП и сеет во мне эти сомнения. Потому, как постоянно пытаюсь думать о том, как всё это дело будет выглядеть в ORM.
Скорее всего так и сделаю, если не к чему другому так и не приду. TEXT поменяю на VARCHAR(32), этого будет вполне достаточно, что бы описать любое свойство модели. Там всё в основном числами описывается. Правда я не знаю как быть с внешними ключами. У меня сейчас например, поле models.battery_id связана с полем batteries.battery_id, где в таблице batteries описаны свойства батарейки. Или их тоже запихнуть в эту же таблицу? Пришёл я пока к такой схеме. Не имеющие отношение к делу таблицы и поля, я не создавал. На BIGINT прошу не обращать внимание, это я погорячился. ![]() ![]() Сейчас кофе попью и попробую поюзать её запросами. Есть ещё одна идея, но я пока ещё не понял как её реализовать. |