![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| voidman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 21.11.2007 Репутация: нет Всего: нет |
Здравствуйте!
С базами данных я немного знаком, но проффи себя назвать явно не могу. Возник вопрос по эффективной ("правильной", "распостраненной") организации оной. Чтоб было понятно приведу простой пример. Есть Фрукты: 1. Яблоко 2. Груша .. n. Абрикос Овощи: 1. Свекла 2. Морковь ... n. Огурец Есть дети, у которых могут быть и овощи и фрукты в произвольном порядке и количестве: МАша - Яблоко, Абрикос / СВекла Денис - Яблоко / Морковь, Огурец и т.д. 1. Как лучше всего организовать базу данных и записывать в нее значения фруктов/овощей если детей может быть от 500 до нескольких тысяч? 2. Задача в основном будет "НАйти всех детей у которых есть такой-то фрукт (или несколько фруктов) и/или такой-то овощь (несколько) " ________________________ Сейчас у меня так: Есть 3 таблицы: фрукты, овощи и основная. В основной на против каждого ребенка (уникального айдишника) в своем столбце (Фрукты, Овощи, Напитки, Черт знает что еще) идут айдишники из соответсвующих таблиц через запятую (1,2). Весь этот вопрос возник потому, что если будет пара тысяч детей, несколько полей с огромной строкой вида "1,5,2,89,3,4,2,89,3,4,65..." поиск "Найти всех детей у которых есть такой-то фрукт (или несколько фруктов) и/или такой-то овощь (несколько) " может занять довльно много времени. То ли использовать Explode() для такой строки и потмо поиск значения, то ли strpos(), а может и сразу MYsql-овское LIKE? Подскажите, пожалуйста, наиболее нормлаьное решение для этой задачи. Спасибо! |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 9 Всего: 315 |
решается тем, что в таблице соответствий в одной записи есть всего один ребёнок с одним id (int) фрукта или овоща.
это конечно увеличит количество записей в таблице, но вернёт базе функциональность вообще фрукты и овощи можно было бы объединить в одну таблицу с разными id_category. |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 3 Всего: 137 |
Прочитай в интернете про такое понятие: "Нормальная Форма". НФ существует окола 12, если не ошибаюсь, но каждая таблица должна быть приведена к 3-ей или 4-ой НФ (не помню точно).
Так вот, значений "через запятую" следует избегать. Я бы сделал так: Таблица 1 - продукты ID продукта Тип продукта (фрукт, овощ) - лучше сделать так же ID и вынести в отд. таблицу виды продуктов Таблица 2 - Дети ID ребенка Его имя и прочая информация Таблица 3 - Дети-Продукты ID ребенка ID продукта количество |
|||
|
||||
| voidman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 21.11.2007 Репутация: нет Всего: нет |
То есть, все сводиться к увеличению основной таблици в nn раз, где каждый ребенок повториться столько раз, сколько разных продуктов у него есть, так?
(это жутко огромная таблица может выйти, скажу я вам) Осветите, плиз, основные негативные стороны работы с данными "через запятую". |
|||
|
||||
| SneG0K |
|
|||
|
Max Mara ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1887 Регистрация: 1.12.2007 Где: Wis Dells Репутация: нет Всего: 54 |
||||
|
||||
| voidman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 21.11.2007 Репутация: нет Всего: нет |
Вроде основную фишку понял. Поправте, если что:
Создаю таблицы: 1. Фрукты 2. Овощи 3. Одежда Потом таблицу Дети (в которую входят какие-то уникальные поля для детей) Дальше еще 3 таблицы: 1. Дети-фрукты 2. Дети-Овощи 3. Дети-Одежда В каждой из этих таблиц будет Айдишник ребенка и Айдишник фрукта (овощм, одежды соответственно). Потом, чтоб найти всех детей со специфическим условием - просто надо "прошерстить" все эти 3 таблицы взаимосвязей и отобрать "совпавших везде" детей. Проверьте, пожалуйста, следующий запрос на "пригодность" (теоретически)
Этим запросом оно должно найти все имена детей, имеющих Мандарин. Правильно? Это сообщение отредактировал(а) voidman - 10.12.2008, 17:30 |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 9 Всего: 315 |
а что, принципиально делить фрукты/овощи/одежда на три таблицы? нельзя в одной?
|
|||
|
||||
| Валерия |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 598 Регистрация: 10.3.2007 Репутация: нет Всего: 8 |
Не = а IN
|
|||
|
||||
| voidman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 21.11.2007 Репутация: нет Всего: нет |
А ведь, правда.. Сенкс ) |
|||
|
||||
| Nigel |
|
|||
|
познаю мир ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 20.11.2007 Репутация: нет Всего: 19 |
Вопрос о правильной структуре бд зависит прежде всего от задач, которые стоят перед вами.
Можно обойтись одной таблицей, если вы выполняете простейшие операции, к примеру: найти детей, у кого по 2 продукта, по 3... Если вам нужно определить сколько фруктов у пети, или сколько овощей у васи, то 2 таблицы. Если требуется найти сколько покупок(будь то фрукты, овощи) сделал тот или иной ребенок, то вот вам еще таблица. Идею, я думаю, поняли? Aliance, да, в теории надо до 4-й формы доводить, вот только очень часто сталкиваюсь с денормализацией бд. Практика на то и практика, что в ней не всегда все как в теории... |
|||
|
||||
| bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 9 Всего: 315 |
||||
|
||||
| voidman |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 21.11.2007 Репутация: нет Всего: нет |
Честно говоря, не совсем. Если возможно, приведите простейшие примеры для вышеописанного. До этого я не слыхал о Нормальных формах и работал в основном с одной таблицей, поэтому сейчас эта информация для меня в новинку и переключиться на "новое мышление" получается не сразу. На данном этапе сделал 3 таблицы: 1. Дети (имя, возраст...) 2. "Товар", который у них может быть (id | category | product_name ) 3. Дети-Товар (id | child_id | category | product_id) (категория тут нужна для разных функций, выборки и т.д. без "опроса других таблиц") Пока, вроде, все работает как надо |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |