Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Универсальная структура 
:(
    Опции темы
rcdimon
Дата 19.10.2008, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: нет
Всего: 2



Привет.

Надо сделать БД для хранения информации о различных объектах- таких как кинотеатры, кафе, бани и т.д.
Хотелось бы хранить все объекты в одной таблице, чтобы не плодить таблицы и не вмешиваться в структуру БД по ходу ее эксплуатации.

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

Первоначально я придумал такую структуру

Таблица объектов
id
type (1- кинотеатр, 2- кафе и т.д.)
title


Таблица свойств
id
object_id (номер объекта, которому соответствует свойство)
property_type (Для кино: 1-ширина экрана, 2- чилос мест в зале и т.д. Соответственно для других типов объектов)
value

В принципе в такой БД действительно можно хранить все, как мне надо. Но есть одно существенное но.
Например, мне надо вывести список кинотеатров. И не просто список названий, но и сразу указать какой у них укран, сколько в них мест. Следовательно объединить таблицы объектов и их свойств. Но т.к. строк в таблице свойств на каждый объект приходится несколько- получаем ответ вроде этого

Кинотеатр Алмаз, 3 метра
Кинотеатр Алмаз, 234 места
Кинотеатр Алмаз, Звук Dolby Digital
Кинотеатр Алмаз, Станция метро "Динамо"


А хотелось бы это все получить, конечно, одной строкой. Можно ли это како-то сделать при такой структуре БД или такая структура не жизнеспособна? Какаю структура тогда эффективнее в данном случае? 

Заранее спасибо.

PM MAIL ICQ   Вверх
skyboy
Дата 19.10.2008, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260



ну, полная универсализация была бы, если б ещё отдельно таблицу со списком имен параметров и типов параметров(перечисление, строка, дата) и список имен типов объектов. и список того, какой тип какие параметры может иметь. 
тогда выйдет очень универсальная таблица, которую будет просто поддерживать, но большое количество связей приведет к тому, о чем пишешь ты: универсальные запросы по универсальной структуре выдают "универсальные" результаты. которые надо дополнительно парсит. потому что человеку не надо нечто вроде XML. ему подавай неоднородную структуру.
так что если ты напишешь запрос, то это будет запрос под вполне определенный тип объекта(например,  который выведет все известные тебе типы параметров для кинотеатра в виде не отдельных записей, а отдельных полей одной записи, но к баням уже запрос будет неприменим и придется писать для бань отдельный запрос).
итого: либо тебе придется писать далеко неуниверсальные запросы под каждый тип объекта(впрочем, сам запрос может храниться в БД в таблице "объекты" - тогда диссонанса между универсальным и конкретным не будет) или же парсить средствами клиентского ЯП возвращаенный "универсализированный" результат.
PM MAIL   Вверх
rcdimon
Дата 19.10.2008, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: нет
Всего: 2



Запросы кстати не обязательно должны быть универсальными. Для кафе, кино и другого допустимо делать свой набор запросов.

Но все-таки как быть с выводом списка объектов определенного типа сразу со значениями их параметров? Не как я показал в предыдущем посте, а нормально:

Кинотеатр Алмаз, 3 метра, 234 места, Метро "Динамо"
Кинотеатр Сатурн, 10 метров, 1090 мест, Метро "Сокол"

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

Добавлено через 55 секунд
PS БД MySQL
PM MAIL ICQ   Вверх
skyboy
Дата 19.10.2008, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260



Цитата(rcdimon @  19.10.2008,  21:59 Найти цитируемый пост)
Но все-таки как быть с выводом списка объектов определенного типа сразу со значениями их параметров?

очень просто.
Код

SELECT o.name, a1.value, a2.value, a3.value
FROM objects as o
LEFT JOIN attributes as a1
ON a1.id_object = o.id AND a1.id_type = 1
LEFT JOIN attributes as a2
ON a2.id_object = o.id AND a1.id_type = 2
LEFT JOIN attributes as a3
ON a3.id_object = o.id AND a1.id_type = 3

Цитата(rcdimon @  19.10.2008,  21:59 Найти цитируемый пост)
И так, чтобы запросы были не слишком тяжелыми, т.к. ожидается весьма серьезная нагрузка.

если каждого объекта будет задан каждый атрибут/параметр, то при использовании inner join и наличии необходимых ключей сильно тормозить на небольшом количестве записей не должно.
если же произвольное количество параметров может отсутствовать, то полджины left join насмешат СУБД до смерти.

PM MAIL   Вверх
Deniz
Дата 20.10.2008, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 7
Всего: 44



Так же можно написать функцию, которая по заданному id будет возвращать строку, сцепленных через разделитель параметров.
Для таблицы свойств можно предусмотреть № по порядку, ибо вид типа:
Код
Кинотеатр Алмаз, 3 метра, 234 места, Метро "Динамо"
Кинотеатр Сатурн, Метро "Сокол", 1090 мест, 10 метров
не совсем читабельный.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Zloxa
Дата 20.10.2008, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



К решению о  разработке собственной EAV, приходил, наверняка, почти каждый программист БД. Наверно это возрастное. Я бы сказал подростковое. Когда скилла уже достаточно, для того чтобы оценить трудозатраты на реализацию ER модели, а работать крайне лениво, возникает великий соблазн упростить себе жизнь. К сожалению, скилла, чтобы оценить сколь тяжел, тернист и бесперспективен этот путь, на этом этапе, у программиста не достаточно. А советы старших товарищей, мол "игра не стоит свеч", человеком, одухотворенным идеей, воспринимаются как консерватизм ленивых снобов.

rcdimon, не пуха тебе ни пера. Через это надо пройти.

Это сообщение отредактировал(а) Zloxa - 20.10.2008, 09:19


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
rcdimon
Дата 20.10.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

Репутация: нет
Всего: 2



Zloxa, ой спасибо за дельный совет
PM MAIL ICQ   Вверх
Zloxa
Дата 20.10.2008, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



Цитата(rcdimon @  20.10.2008,  15:20 Найти цитируемый пост)
ой спасибо

Ёрничаешь, кстати - зря. Поиском намного проще пользоваться, когда знаешь как называется то, что ты ищешь. Когда я в последний раз страдал подобной фигней, я убил много времени на то, чтобы узнать как эта фигня правильно называетя, а потом, нарыл очень много занимательных материалов, на тему этой фигни. Даже кандидатский диссер чейто с вполне сносной ER моделью скачивал.



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0837 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.