Вопрос про MySQL

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Вопрос про MySQL

Сообщение slavcodev »

Задался тут вопросом и решил выслушать чьи-нибудь комментарии до того как решить для себя.

Есть сущности: Новость, Статическая страница, Пост блога.
Все эти сущности имеют одинаковые атрибуты: id, content, author и др.

Вот и вопрос, как логичнее держать данные в базе, создать три таблицы или держать в одной таблице с дополнительным полем type :?

Пока сам я вижу только по одному сомнительному плюсу к каждому виду и не одного минуса :)

Поделитесь мнениями.
Спасибо.
Жду Yii 3!
Аватара пользователя
Ozzy
Сообщения: 269
Зарегистрирован: 2009.04.02, 15:09
Откуда: Украина, Одесса

Re: Вопрос про MySQL

Сообщение Ozzy »

Разные таблицы

А вообще надо читать доки по проектированию :) так во-первых удобнее, во-вторых расширяемее (в случае нужды добавления только для постов к примеру нового поля), да и идеологически правильнее.
Мой маленький блог - http://dbhelp.ru
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Вопрос про MySQL

Сообщение slavcodev »

Можешь посоветовать доку про проектированию?
Жду Yii 3!
Аватара пользователя
Ozzy
Сообщения: 269
Зарегистрирован: 2009.04.02, 15:09
Откуда: Украина, Одесса

Re: Вопрос про MySQL

Сообщение Ozzy »

у меня к сожалению, все в печатном виде.
могу подсказать автора и название, а там уже поищешь может и в инете найдешь. идет?
Мой маленький блог - http://dbhelp.ru
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Вопрос про MySQL

Сообщение slavcodev »

конечно пойдет, может и я в печатном виде найду :)
Жду Yii 3!
Аватара пользователя
Caveman
Сообщения: 152
Зарегистрирован: 2009.04.04, 20:56
Откуда: Москва
Контактная информация:

Re: Вопрос про MySQL

Сообщение Caveman »

Посмотрел на полку, что по проектированию есть:
Эрик Дж. Нейбург, Роберт Максимчук "Проектирование баз данных с помощью UML"
М.Фаулер "UML. Основы"
Г.Буч, Р.Максимчук и др. "Объектно-ориентированный анализ и проектирование с примерами приложений"
Э.Гамма, Р.Хелм, Р.Джонсон, Д.Влиссидес "Примеры объектно-ориентированного проектирования. Паттерны проектирования"
Аватара пользователя
Razunter
Сообщения: 18
Зарегистрирован: 2009.07.04, 17:36
Контактная информация:

Re: Вопрос про MySQL

Сообщение Razunter »

А по-моему, так гибче хранить одной таблицей, когда есть еще таблица "типы" и таблицы для полей... Да, громоздко, но на сложных сайтах иначе получается очень неудобно - редактировать все 20 типов материалов, у каждого свои вьювы, модели, контроллеры...
Хотя для простых сайтов, конечно, лучше отдельными.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Вопрос про MySQL

Сообщение slavcodev »

Ну вот появилось второе мнение.

Принимаю, набросились на меня "иди читай мат часть" :) Спасибо за совет, честно скажу, я читаю книги, как только есть свободное время.

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

Вот сижу и не знаю что и думать, авторы WordPress'а олухи не грамотные или то что они засунули посты, страницы и атачменты в одну таблицу это хорошо продуманный шаг :?

У них как раз две таблицы одна posts хранит объекты и их основные поля, и рядом вторая postmeta, которая хранит дополнительные поля в виде key=value, можешь расширять данные объектов как хочется хоть каждый день.
Жду Yii 3!
Аватара пользователя
Razunter
Сообщения: 18
Зарегистрирован: 2009.07.04, 17:36
Контактная информация:

Re: Вопрос про MySQL

Сообщение Razunter »

mc-bear писал(а): Вот сижу и не знаю что и думать, авторы WordPress'а олухи не грамотные или то что они засунули посты, страницы и атачменты в одну таблицу это хорошо продуманный шаг :?
В Drupal так же. Полагаю, во всех CMS так же, иначе сложно было бы добавить возможность создавать новые типы на лету.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Вопрос про MySQL

Сообщение samdark »

С одной стороны хранение в одной таблице хорошо: довольно много кода получается не писать. С другой получаются немного более медленные выборки и затруднённое расширение системы.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Вопрос про MySQL

Сообщение slavcodev »

Чем будет затруднена выборка? Добавление WHERE type=??
Жду Yii 3!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Вопрос про MySQL

Сообщение samdark »

1. where type.
2. Большее количество записей.

Хотя для не очень больших систем замедление совершенно незначительное.
Аватара пользователя
aser
Сообщения: 167
Зарегистрирован: 2009.04.02, 14:25
Откуда: Киев

Re: Вопрос про MySQL

Сообщение aser »

Тут действительно наверное стоит исходить из соображений для чего это делается:
1. Нужна ли расширяемость.
2. Количество записей каждого из типов.
2. Количество записей каждого из типов по отношению к другим.
3. Использование кеша.
4. Время которое есть на реализацию проекта.

Думаю что на цвет и вкус тут товарищей нет. Друпал и ВПрес ставили задачу легкой расширяемости, а кеш позволяет снизить нагрузку до того что не важно насколько сложные запросы.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Вопрос про MySQL

Сообщение slavcodev »

aser писал(а):Тут действительно наверное стоит исходить из соображений для чего это делается:
1. Нужна ли расширяемость.
А кому она не нужна? Конечно же умеренно тратя производительность
aser писал(а):2. Количество записей каждого из типов.
2. Количество записей каждого из типов по отношению к другим.
Тут пока не очень соображаю как это может играть роли.
aser писал(а):3. Использование кеша.
Опять же, если есть возможность использовать кеш, разве кто-то откажется?
Тем более вопрос про довольно статические записи (новости, записки блока и тд) кеш тут идеально подходит.
aser писал(а):4. Время которое есть на реализацию проекта.
Опять же не вижу разницы во времени. Плюс время есть, т.к. разработка для будущих проектов. Так что не к спеху.
aser писал(а):Думаю что на цвет и вкус тут товарищей нет. Друпал и ВПрес ставили задачу легкой расширяемости, а кеш позволяет снизить нагрузку до того что не важно насколько сложные запросы.
Это и хорошо, т.к. для таких объектов как новости, записки блога, расширяемость и кеш самое то.
Жду Yii 3!
Аватара пользователя
aser
Сообщения: 167
Зарегистрирован: 2009.04.02, 14:25
Откуда: Киев

Re: Вопрос про MySQL

Сообщение aser »

1.
А кому она не нужна? Конечно же умеренно тратя производительность
Если делается сайт с нуля с прописанными четко требованиями зачем мудрить?

2.
Тут пока не очень соображаю как это может играть роли.
Ну смотрите если в базе статей у вас изначально будет висеть > 100 000 статей c пополнением > 200 статей в сутки, в блоге > 2000 с пополнением > 10 в сутки
и на всем сайте 10 статических страниц то тут тоже нужно подумать возможно стоит все же разделить эти сущности и для каждой сделать свою расширяемость.
P.S. Это нагрузки небольшого но активного сайта, так сказать цветочки.
Опять же, если есть возможность использовать кеш, разве кто-то откажется?
Ну если вы делаете презентацию расчитаную на 100 человек в день, то зачем тратить свое время и лишние ресурсы, MySQL и не сложная структура сама все за вас сделает ;)
Это и хорошо, т.к. для таких объектов как новости, записки блога, расширяемость и кеш самое то.
Ну тут думаю что вы ответили сами на свой вопрос :D
Аватара пользователя
Ozzy
Сообщения: 269
Зарегистрирован: 2009.04.02, 15:09
Откуда: Украина, Одесса

Re: Вопрос про MySQL

Сообщение Ozzy »

Пихают все по одной таблице без надобности - люди не прочитавшие главу про JOIN-ы. ИМХО

А иначе - смысла особого нету, лишь затруднение расширения самого проекта.
Мой маленький блог - http://dbhelp.ru
Аватара пользователя
Одиночка Айс
Сообщения: 267
Зарегистрирован: 2010.02.05, 10:26
Откуда: Алма-Ата, Казахстан
Контактная информация:

Re: Вопрос про MySQL

Сообщение Одиночка Айс »

Razunter писал(а):А по-моему, так гибче хранить одной таблицей, когда есть еще таблица "типы" и таблицы для полей... Да, громоздко, но на сложных сайтах иначе получается очень неудобно - редактировать все 20 типов материалов, у каждого свои вьювы, модели, контроллеры...
Хотя для простых сайтов, конечно, лучше отдельными.
Отчасти согласен, у меня все компании хранятся в одной таблице, разделенные только по типу (по которому и "выцарапываются" из базы). НО я считаю, что это актуально лишь в том случае, когда все записи абсолютно идентичны по полям.
Ни любви, ни тоски, ни жалости...
mitallast
Сообщения: 207
Зарегистрирован: 2010.02.21, 20:40
Откуда: Голицыно
Контактная информация:

Re: Вопрос про MySQL

Сообщение mitallast »

Есть у меня немалый опыт работы с cms по такому принципу работающей - около 5-6
сайтов.

Сейчас, сравнивая однотабличную структуру и многотабличную - прихожу к мысли, что многотабличная куда более гибка, быстрее работает, больше возможностей работы с foreign key, и прочие многие плюсы.

Кстати, в той cms дополнительные свойства можно хранить в двух реживах - в общей таблице, по принципу property type - property value - и в отдельной таблице по одному столбцу на свойство, которая джойнится к основной.

Второй режим ввели из-за проблем с производительностью, при больших обьемах данных - каталоги в миллионы записей, + классификаторы к ним тоже не маленькие.

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

Есть минус, я его считаю самым большим - поддержка структуры данных затруднена. Например, если в одном типе данных требуется обязательно свойство foo, а в других типах уже не нужно - его не сделаешь NOT NULL, придется перекладывать проверку на php, а не на базу данных.

Минусов много, не все даже вспомню. Мое решение - если на проекте много однотипных сущностей, имеет смысл использовать однотабличный вариант, такие задачи часто встречаются в интернет-магазинах. Если же сущности довольно сильно отличаются, куда разумнее использовать отдельные таблицы - например saas`ы.
keltanas
Сообщения: 39
Зарегистрирован: 2009.07.15, 10:19
Откуда: Санкт-Петербург
Контактная информация:

Re: Вопрос про MySQL

Сообщение keltanas »

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

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

В плюс могу записать удобный поиск по базе, если не используется отдельно таблица индекса для модуля поиска.

Кстати, всякие join, order, group и пр. как раз и могут прилично базу прогнуть. Но порой бывает с ними быстрее (если индексы правильно расставить)))
oleg
Сообщения: 58
Зарегистрирован: 2010.04.20, 09:19
Откуда: Россия, Воронеж

Re: Вопрос про MySQL

Сообщение oleg »

В начале треда (несколько лет назад :)) был поднят вопрос про литературу по проектированию БД. Можно всё таки привести примеры подобных книг?
Ответить