Как правильно составить связи для сущностей?
-
- Сообщения: 26
- Зарегистрирован: 2015.07.28, 17:48
Как правильно составить связи для сущностей?
Всем привет. У меня есть вопрос. Может кто нибудь даст ответ. Например у меня есть несколько сущностей: баннеры, видео, тексты. Хочу прикрутить теги для этих сущностей, чтобы сделать фильтр. Насколько разумно делать теги общими для всех? То есть одна сущность "ТЕГ" на 3( баннеры, видео, тексты). Если например захочу еще как-то разделять теги по категориям: формат, язык. То есть введу поле type в сущность тегов. Вот пример:
Или все таки лучше вводить отдельные таблицы вида языки, форматы и фильтровать по ним. А теги будут общими без типов. Пример:
Если языков мало 5-10. Вообще тогда стоит вводить таблицу?) Что-то не могу нормально построить связи. Есть ли хорошие рекомендации по построению? Еще есть вариант отдельно вводить для каждой сущности свою "ТЕГ"
Или все таки лучше вводить отдельные таблицы вида языки, форматы и фильтровать по ним. А теги будут общими без типов. Пример:
Если языков мало 5-10. Вообще тогда стоит вводить таблицу?) Что-то не могу нормально построить связи. Есть ли хорошие рекомендации по построению? Еще есть вариант отдельно вводить для каждой сущности свою "ТЕГ"
Re: Как правильно составить связи для сущностей?
Доброго времени суток!
Что такое material_type_id в таблице tag_material? Это обозначение конкретной таблицы материалов? Тогда это антипаттерн "Полиморфическая ассоциация", вы смешиваете метаданные с данными. Не делайте этого. См. книгу SQL Antipatterns: https://www.books.ru/books/programmirov ... l-1563161/
Для тегов я бы сделал таблицу tag и для каждой таблицы материалов таблицу связку, то есть теги будут связаны с видео отношением "многие ко многим", с баннерами "многие ко многим", с текстами "многие ко многим".
Формат и язык ни в коем случае с тегами не мешать. Делать либо таблицами справочниками, либо хардкодить список кодов языков и форматов баннеров, например вместо id языка в каждое видео будете писать код "RU" или "EN". Второе будет быстрее работать.
Что такое material_type_id в таблице tag_material? Это обозначение конкретной таблицы материалов? Тогда это антипаттерн "Полиморфическая ассоциация", вы смешиваете метаданные с данными. Не делайте этого. См. книгу SQL Antipatterns: https://www.books.ru/books/programmirov ... l-1563161/
Для тегов я бы сделал таблицу tag и для каждой таблицы материалов таблицу связку, то есть теги будут связаны с видео отношением "многие ко многим", с баннерами "многие ко многим", с текстами "многие ко многим".
Формат и язык ни в коем случае с тегами не мешать. Делать либо таблицами справочниками, либо хардкодить список кодов языков и форматов баннеров, например вместо id языка в каждое видео будете писать код "RU" или "EN". Второе будет быстрее работать.
-
- Сообщения: 26
- Зарегистрирован: 2015.07.28, 17:48
Re: Как правильно составить связи для сущностей?
Спасибо за ответ. А что если нужно будет сделать поиск материалов по тегам? Получается придется пройтись по всем таблицами связей многие ко многим?
В итоге получается так.
В итоге получается так.
Re: Как правильно составить связи для сущностей?
Ну с JOIN можно все это в один запрос уложить.FeRaMon4ik писал(а): ↑2017.02.11, 12:45 Спасибо за ответ. А что если нужно будет сделать поиск материалов по тегам? Получается придется пройтись по всем таблицами связей многие ко многим?
По структуре - точно хотите динамизм на языки/форматы? Форматы и языки будут добавляться динамически? Проще в коде их определить в виде констант, если они не часто будут меняться и нет требований по добавлению оных пользователями.
-
- Сообщения: 26
- Зарегистрирован: 2015.07.28, 17:48
Re: Как правильно составить связи для сущностей?
Ну вот языки будут меняться редко. Предлагаете создать класс например BannerLanguages и внутри него хранить константы. constant RUSSIAN = 'RUSSIAN'. И некоторые методы, например возврат всех языков BannerLanguages.getAll()? Форматы буду вычисляться автоматически по размеру изображения и если такого нет, то добавляться в таблицу.
-
- Сообщения: 26
- Зарегистрирован: 2015.07.28, 17:48
Re: Как правильно составить связи для сущностей?
Появилась еще одна сложность. Сущность "Группы баннеров", которая имеют свои поля и тд. Помимо этого она должна включать языки баннеров, которые в ней есть, теги баннеров и форматы. И фильтрация сначала происходит по группам баннеров. А когда заходим в группу баннеров, то фильтрация уже идете по баннерам внутри этой группы. Вот и думаю ее нужно выделять как отдельную сущность и делать для нее отдельные таблицы с тегами, форматами и языками, данные в которые будут добавляться после добавления баннера? Эх не хватает мне человека с большим опытом в проектировании бд, которым бы пнул в правильном направлении.anton_z писал(а): ↑2017.02.11, 13:15Ну с JOIN можно все это в один запрос уложить.FeRaMon4ik писал(а): ↑2017.02.11, 12:45 Спасибо за ответ. А что если нужно будет сделать поиск материалов по тегам? Получается придется пройтись по всем таблицами связей многие ко многим?
По структуре - точно хотите динамизм на языки/форматы? Форматы и языки будут добавляться динамически? Проще в коде их определить в виде констант, если они не часто будут меняться и нет требований по добавлению оных пользователями.
Re: Как правильно составить связи для сущностей?
Да. примерно так.FeRaMon4ik писал(а): ↑2017.02.11, 13:50 Ну вот языки будут меняться редко. Предлагаете создать класс например BannerLanguages и внутри него хранить константы. constant RUSSIAN = 'RUSSIAN'. И некоторые методы, например возврат всех языков BannerLanguages.getAll()?
Зачем тогда нужна таблица форматов? Может просто в таблице баннеров сделать колонки ширина/высота, формат изображения и писать туда. Или есть какие-то свои обозначения форматов?FeRaMon4ik писал(а): ↑2017.02.11, 13:50 Форматы буду вычисляться автоматически по размеру изображения и если такого нет, то добавляться в таблицу.
Re: Как правильно составить связи для сущностей?
Тегирование баннеров будет происходить внутри группы или та или иная группа баннеров может быть обозначена тегами? Или и то и другое одновременно?FeRaMon4ik писал(а): ↑2017.02.11, 23:46 Появилась еще одна сложность. Сущность "Группы баннеров", которая имеют свои поля и тд. Помимо этого она должна включать языки баннеров, которые в ней есть, теги баннеров и форматы. И фильтрация сначала происходит по группам баннеров. А когда заходим в группу баннеров, то фильтрация уже идете по баннерам внутри этой группы. Вот и думаю ее нужно выделять как отдельную сущность и делать для нее отдельные таблицы с тегами, форматами и языками, данные в которые будут добавляться после добавления баннера? Эх не хватает мне человека с большим опытом в проектировании бд, которым бы пнул в правильном направлении.
-
- Сообщения: 26
- Зарегистрирован: 2015.07.28, 17:48
Re: Как правильно составить связи для сущностей?
И то и другое. Группа баннеров может иметь отличные теги, но так же она должна иметь все (теги, форматы) находящихся в ней баннеров. Ну и так же баннер имеет свои теги, формат. Просто получается группа баннеров это такое собирательный образ, того что в не находится, плюс некоторые специфичные поля.anton_z писал(а): ↑2017.02.12, 03:41Тегирование баннеров будет происходить внутри группы или та или иная группа баннеров может быть обозначена тегами? Или и то и другое одновременно?FeRaMon4ik писал(а): ↑2017.02.11, 23:46 Появилась еще одна сложность. Сущность "Группы баннеров", которая имеют свои поля и тд. Помимо этого она должна включать языки баннеров, которые в ней есть, теги баннеров и форматы. И фильтрация сначала происходит по группам баннеров. А когда заходим в группу баннеров, то фильтрация уже идете по баннерам внутри этой группы. Вот и думаю ее нужно выделять как отдельную сущность и делать для нее отдельные таблицы с тегами, форматами и языками, данные в которые будут добавляться после добавления баннера? Эх не хватает мне человека с большим опытом в проектировании бд, которым бы пнул в правильном направлении.
Re: Как правильно составить связи для сущностей?
Так лучше не делать. Слишком много кладете на эти группы баннеров. Я так понял, вы хотите что-то вроде EAV там сдеалать, чтобы группы баннеров хранили информацию об атрибутаз, а баннеры, относящиеся к группе, хранили значения?FeRaMon4ik писал(а): ↑2017.02.12, 13:26И то и другое. Группа баннеров может иметь отличные теги, но так же она должна иметь все (теги, форматы) находящихся в ней баннеров. Ну и так же баннер имеет свои теги, формат. Просто получается группа баннеров это такое собирательный образ, того что в не находится, плюс некоторые специфичные поля.anton_z писал(а): ↑2017.02.12, 03:41Тегирование баннеров будет происходить внутри группы или та или иная группа баннеров может быть обозначена тегами? Или и то и другое одновременно?FeRaMon4ik писал(а): ↑2017.02.11, 23:46 Появилась еще одна сложность. Сущность "Группы баннеров", которая имеют свои поля и тд. Помимо этого она должна включать языки баннеров, которые в ней есть, теги баннеров и форматы. И фильтрация сначала происходит по группам баннеров. А когда заходим в группу баннеров, то фильтрация уже идете по баннерам внутри этой группы. Вот и думаю ее нужно выделять как отдельную сущность и делать для нее отдельные таблицы с тегами, форматами и языками, данные в которые будут добавляться после добавления баннера? Эх не хватает мне человека с большим опытом в проектировании бд, которым бы пнул в правильном направлении.
-
- Сообщения: 26
- Зарегистрирован: 2015.07.28, 17:48
Re: Как правильно составить связи для сущностей?
Что-то типо того. Но чтобы можно было делать поиск и фильтрацию и по группам и внутри группы. Но что-то как-то у меня пока здраво не получается это сделать. Щас все закостылено и мне больно.
Re: Как правильно составить связи для сущностей?
Сам в такой шкуре бывал. да это больно)FeRaMon4ik писал(а): ↑2017.02.12, 15:07 Что-то типо того. Но чтобы можно было делать поиск и фильтрацию и по группам и внутри группы. Но что-то как-то у меня пока здраво не получается это сделать. Щас все закостылено и мне больно.
От EAV лучше избавляться, будет гораздо проще все. У вас обязательное условие, чтобы набор атрибутов в категории изменялся пользователем/модератором?
-
- Сообщения: 26
- Зарегистрирован: 2015.07.28, 17:48
Re: Как правильно составить связи для сущностей?
У меня щас и EAV нет) Там все намного хуже) Если под набором атрибутов подразумевается набор различных фильтров, то изменять его может только админ, то бишь я)anton_z писал(а): ↑2017.02.12, 16:52Сам в такой шкуре бывал. да это больно)FeRaMon4ik писал(а): ↑2017.02.12, 15:07 Что-то типо того. Но чтобы можно было делать поиск и фильтрацию и по группам и внутри группы. Но что-то как-то у меня пока здраво не получается это сделать. Щас все закостылено и мне больно.
От EAV лучше избавляться, будет гораздо проще все. У вас обязательное условие, чтобы набор атрибутов в категории изменялся пользователем/модератором?
EAV в данном случае получается такой? У нас есть 2 сущности баннеры и группа баннеров. Создаем для них 3 таблицы. 1 таблица атрибутов. 2 таблица значения и 3 многие ко многим связи? Или я не правильно понимаю
Re: Как правильно составить связи для сущностей?
EAV вы поняли правильно, но так ли он вам нужен? У вас какая БД, какая у нее версия?FeRaMon4ik писал(а): ↑2017.02.12, 18:26 EAV в данном случае получается такой? У нас есть 2 сущности баннеры и группа баннеров. Создаем для них 3 таблицы. 1 таблица атрибутов. 2 таблица значения и 3 многие ко многим связи? Или я не правильно понимаю
-
- Сообщения: 26
- Зарегистрирован: 2015.07.28, 17:48
Re: Как правильно составить связи для сущностей?
Ну вот, в 5.7 есть JSON-колонки. По ним даже индексы вроде можно строить. Используйте их для своих динамических атрибутов.
Если есть программист, который постоянно поддерживает проект, списки полей для каждой категории можно захардкодить в виде классов.
Новая категория появилась - новый класс. Все сразу становится проще и быстрее.
P.S. смысл делать EAV есть если делаете Magento)