Как правильно составить связи для сущностей?

Обсуждаем, как правильно строить приложения
Ответить
FeRaMon4ik
Сообщения: 26
Зарегистрирован: 2015.07.28, 17:48

Как правильно составить связи для сущностей?

Сообщение FeRaMon4ik »

Всем привет. У меня есть вопрос. Может кто нибудь даст ответ. Например у меня есть несколько сущностей: баннеры, видео, тексты. Хочу прикрутить теги для этих сущностей, чтобы сделать фильтр. Насколько разумно делать теги общими для всех? То есть одна сущность "ТЕГ" на 3( баннеры, видео, тексты). Если например захочу еще как-то разделять теги по категориям: формат, язык. То есть введу поле type в сущность тегов. Вот пример:
Изображение
Или все таки лучше вводить отдельные таблицы вида языки, форматы и фильтровать по ним. А теги будут общими без типов. Пример:
Изображение
Если языков мало 5-10. Вообще тогда стоит вводить таблицу?) Что-то не могу нормально построить связи. Есть ли хорошие рекомендации по построению? Еще есть вариант отдельно вводить для каждой сущности свою "ТЕГ"
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Как правильно составить связи для сущностей?

Сообщение anton_z »

Доброго времени суток!

Что такое material_type_id в таблице tag_material? Это обозначение конкретной таблицы материалов? Тогда это антипаттерн "Полиморфическая ассоциация", вы смешиваете метаданные с данными. Не делайте этого. См. книгу SQL Antipatterns: https://www.books.ru/books/programmirov ... l-1563161/

Для тегов я бы сделал таблицу tag и для каждой таблицы материалов таблицу связку, то есть теги будут связаны с видео отношением "многие ко многим", с баннерами "многие ко многим", с текстами "многие ко многим".
Формат и язык ни в коем случае с тегами не мешать. Делать либо таблицами справочниками, либо хардкодить список кодов языков и форматов баннеров, например вместо id языка в каждое видео будете писать код "RU" или "EN". Второе будет быстрее работать.
FeRaMon4ik
Сообщения: 26
Зарегистрирован: 2015.07.28, 17:48

Re: Как правильно составить связи для сущностей?

Сообщение FeRaMon4ik »

Спасибо за ответ. А что если нужно будет сделать поиск материалов по тегам? Получается придется пройтись по всем таблицами связей многие ко многим?
В итоге получается так.
Изображение
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Как правильно составить связи для сущностей?

Сообщение anton_z »

FeRaMon4ik писал(а): 2017.02.11, 12:45 Спасибо за ответ. А что если нужно будет сделать поиск материалов по тегам? Получается придется пройтись по всем таблицами связей многие ко многим?
Ну с JOIN можно все это в один запрос уложить.

По структуре - точно хотите динамизм на языки/форматы? Форматы и языки будут добавляться динамически? Проще в коде их определить в виде констант, если они не часто будут меняться и нет требований по добавлению оных пользователями.
FeRaMon4ik
Сообщения: 26
Зарегистрирован: 2015.07.28, 17:48

Re: Как правильно составить связи для сущностей?

Сообщение FeRaMon4ik »

Ну вот языки будут меняться редко. Предлагаете создать класс например BannerLanguages и внутри него хранить константы. constant RUSSIAN = 'RUSSIAN'. И некоторые методы, например возврат всех языков BannerLanguages.getAll()? Форматы буду вычисляться автоматически по размеру изображения и если такого нет, то добавляться в таблицу.
FeRaMon4ik
Сообщения: 26
Зарегистрирован: 2015.07.28, 17:48

Re: Как правильно составить связи для сущностей?

Сообщение FeRaMon4ik »

anton_z писал(а): 2017.02.11, 13:15
FeRaMon4ik писал(а): 2017.02.11, 12:45 Спасибо за ответ. А что если нужно будет сделать поиск материалов по тегам? Получается придется пройтись по всем таблицами связей многие ко многим?
Ну с JOIN можно все это в один запрос уложить.

По структуре - точно хотите динамизм на языки/форматы? Форматы и языки будут добавляться динамически? Проще в коде их определить в виде констант, если они не часто будут меняться и нет требований по добавлению оных пользователями.
Появилась еще одна сложность. Сущность "Группы баннеров", которая имеют свои поля и тд. Помимо этого она должна включать языки баннеров, которые в ней есть, теги баннеров и форматы. И фильтрация сначала происходит по группам баннеров. А когда заходим в группу баннеров, то фильтрация уже идете по баннерам внутри этой группы. Вот и думаю ее нужно выделять как отдельную сущность и делать для нее отдельные таблицы с тегами, форматами и языками, данные в которые будут добавляться после добавления баннера? Эх не хватает мне человека с большим опытом в проектировании бд, которым бы пнул в правильном направлении.
Изображение
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Как правильно составить связи для сущностей?

Сообщение anton_z »

FeRaMon4ik писал(а): 2017.02.11, 13:50 Ну вот языки будут меняться редко. Предлагаете создать класс например BannerLanguages и внутри него хранить константы. constant RUSSIAN = 'RUSSIAN'. И некоторые методы, например возврат всех языков BannerLanguages.getAll()?
Да. примерно так.
FeRaMon4ik писал(а): 2017.02.11, 13:50 Форматы буду вычисляться автоматически по размеру изображения и если такого нет, то добавляться в таблицу.
Зачем тогда нужна таблица форматов? Может просто в таблице баннеров сделать колонки ширина/высота, формат изображения и писать туда. Или есть какие-то свои обозначения форматов?
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Как правильно составить связи для сущностей?

Сообщение anton_z »

FeRaMon4ik писал(а): 2017.02.11, 23:46 Появилась еще одна сложность. Сущность "Группы баннеров", которая имеют свои поля и тд. Помимо этого она должна включать языки баннеров, которые в ней есть, теги баннеров и форматы. И фильтрация сначала происходит по группам баннеров. А когда заходим в группу баннеров, то фильтрация уже идете по баннерам внутри этой группы. Вот и думаю ее нужно выделять как отдельную сущность и делать для нее отдельные таблицы с тегами, форматами и языками, данные в которые будут добавляться после добавления баннера? Эх не хватает мне человека с большим опытом в проектировании бд, которым бы пнул в правильном направлении.
Тегирование баннеров будет происходить внутри группы или та или иная группа баннеров может быть обозначена тегами? Или и то и другое одновременно?
FeRaMon4ik
Сообщения: 26
Зарегистрирован: 2015.07.28, 17:48

Re: Как правильно составить связи для сущностей?

Сообщение FeRaMon4ik »

anton_z писал(а): 2017.02.12, 03:41
FeRaMon4ik писал(а): 2017.02.11, 23:46 Появилась еще одна сложность. Сущность "Группы баннеров", которая имеют свои поля и тд. Помимо этого она должна включать языки баннеров, которые в ней есть, теги баннеров и форматы. И фильтрация сначала происходит по группам баннеров. А когда заходим в группу баннеров, то фильтрация уже идете по баннерам внутри этой группы. Вот и думаю ее нужно выделять как отдельную сущность и делать для нее отдельные таблицы с тегами, форматами и языками, данные в которые будут добавляться после добавления баннера? Эх не хватает мне человека с большим опытом в проектировании бд, которым бы пнул в правильном направлении.
Тегирование баннеров будет происходить внутри группы или та или иная группа баннеров может быть обозначена тегами? Или и то и другое одновременно?
И то и другое. Группа баннеров может иметь отличные теги, но так же она должна иметь все (теги, форматы) находящихся в ней баннеров. Ну и так же баннер имеет свои теги, формат. Просто получается группа баннеров это такое собирательный образ, того что в не находится, плюс некоторые специфичные поля.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Как правильно составить связи для сущностей?

Сообщение anton_z »

FeRaMon4ik писал(а): 2017.02.12, 13:26
anton_z писал(а): 2017.02.12, 03:41
FeRaMon4ik писал(а): 2017.02.11, 23:46 Появилась еще одна сложность. Сущность "Группы баннеров", которая имеют свои поля и тд. Помимо этого она должна включать языки баннеров, которые в ней есть, теги баннеров и форматы. И фильтрация сначала происходит по группам баннеров. А когда заходим в группу баннеров, то фильтрация уже идете по баннерам внутри этой группы. Вот и думаю ее нужно выделять как отдельную сущность и делать для нее отдельные таблицы с тегами, форматами и языками, данные в которые будут добавляться после добавления баннера? Эх не хватает мне человека с большим опытом в проектировании бд, которым бы пнул в правильном направлении.
Тегирование баннеров будет происходить внутри группы или та или иная группа баннеров может быть обозначена тегами? Или и то и другое одновременно?
И то и другое. Группа баннеров может иметь отличные теги, но так же она должна иметь все (теги, форматы) находящихся в ней баннеров. Ну и так же баннер имеет свои теги, формат. Просто получается группа баннеров это такое собирательный образ, того что в не находится, плюс некоторые специфичные поля.
Так лучше не делать. Слишком много кладете на эти группы баннеров. Я так понял, вы хотите что-то вроде EAV там сдеалать, чтобы группы баннеров хранили информацию об атрибутаз, а баннеры, относящиеся к группе, хранили значения?
FeRaMon4ik
Сообщения: 26
Зарегистрирован: 2015.07.28, 17:48

Re: Как правильно составить связи для сущностей?

Сообщение FeRaMon4ik »

anton_z писал(а): 2017.02.12, 14:45 Так лучше не делать. Слишком много кладете на эти группы баннеров. Я так понял, вы хотите что-то вроде EAV там сдеалать, чтобы группы баннеров хранили информацию об атрибутаз, а баннеры, относящиеся к группе, хранили значения?
Что-то типо того. Но чтобы можно было делать поиск и фильтрацию и по группам и внутри группы. Но что-то как-то у меня пока здраво не получается это сделать. Щас все закостылено и мне больно.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Как правильно составить связи для сущностей?

Сообщение anton_z »

FeRaMon4ik писал(а): 2017.02.12, 15:07 Что-то типо того. Но чтобы можно было делать поиск и фильтрацию и по группам и внутри группы. Но что-то как-то у меня пока здраво не получается это сделать. Щас все закостылено и мне больно.
Сам в такой шкуре бывал. да это больно)

От EAV лучше избавляться, будет гораздо проще все. У вас обязательное условие, чтобы набор атрибутов в категории изменялся пользователем/модератором?
FeRaMon4ik
Сообщения: 26
Зарегистрирован: 2015.07.28, 17:48

Re: Как правильно составить связи для сущностей?

Сообщение FeRaMon4ik »

anton_z писал(а): 2017.02.12, 16:52
FeRaMon4ik писал(а): 2017.02.12, 15:07 Что-то типо того. Но чтобы можно было делать поиск и фильтрацию и по группам и внутри группы. Но что-то как-то у меня пока здраво не получается это сделать. Щас все закостылено и мне больно.
Сам в такой шкуре бывал. да это больно)

От EAV лучше избавляться, будет гораздо проще все. У вас обязательное условие, чтобы набор атрибутов в категории изменялся пользователем/модератором?
У меня щас и EAV нет) Там все намного хуже) Если под набором атрибутов подразумевается набор различных фильтров, то изменять его может только админ, то бишь я)
EAV в данном случае получается такой? У нас есть 2 сущности баннеры и группа баннеров. Создаем для них 3 таблицы. 1 таблица атрибутов. 2 таблица значения и 3 многие ко многим связи? Или я не правильно понимаю
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Как правильно составить связи для сущностей?

Сообщение anton_z »

FeRaMon4ik писал(а): 2017.02.12, 18:26 EAV в данном случае получается такой? У нас есть 2 сущности баннеры и группа баннеров. Создаем для них 3 таблицы. 1 таблица атрибутов. 2 таблица значения и 3 многие ко многим связи? Или я не правильно понимаю
EAV вы поняли правильно, но так ли он вам нужен? У вас какая БД, какая у нее версия?
FeRaMon4ik
Сообщения: 26
Зарегистрирован: 2015.07.28, 17:48

Re: Как правильно составить связи для сущностей?

Сообщение FeRaMon4ik »

anton_z писал(а): 2017.02.13, 03:34 EAV вы поняли правильно, но так ли он вам нужен? У вас какая БД, какая у нее версия?
Mysql 5.7)
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Как правильно составить связи для сущностей?

Сообщение anton_z »

FeRaMon4ik писал(а): 2017.02.13, 10:08
anton_z писал(а): 2017.02.13, 03:34 EAV вы поняли правильно, но так ли он вам нужен? У вас какая БД, какая у нее версия?
Mysql 5.7)
Ну вот, в 5.7 есть JSON-колонки. По ним даже индексы вроде можно строить. Используйте их для своих динамических атрибутов.
Если есть программист, который постоянно поддерживает проект, списки полей для каждой категории можно захардкодить в виде классов.
Новая категория появилась - новый класс. Все сразу становится проще и быстрее.

P.S. смысл делать EAV есть если делаете Magento)
Ответить