Научное название связи M:M но без промежуточной таблицы

StalkerClasses

Новичок
Заметил что есть проекты, в которых например при редактировании новости есть поле выбора нескольких страниц или нескльких категорий.
При выборе одной страницы в новости - это можно характеризовать как M:1.
Но когда выбирается несколько страниц - то пишется список ID-шек 1,5,15,25,40 (своего рода M:M) - т.е. значения через запятую записываются в поле новости. Промежуточная таблица не используется.

Я даже поиск могу составить:
Выбрать все новости у которых категория 5, 25

PHP:
SELECT * FROM news

WHERE

(
fieldpagestop = Like '5,%' OR // ищем в начале строки
fieldpagestop = Like '%,5' OR // ищем в конце строки
fieldpagestop = Like '%,5,%' OR // ищем в середине строки
fieldpagestop = 5 // ищем точное совпадение
)

AND

(
fieldpagestop = Like '25,%' OR // ищем в начале строки
fieldpagestop = Like '%,25' OR // ищем в конце строки
fieldpagestop = Like '%,25,%' OR // ищем в середине строки
fieldpagestop = 25 // ищем точное совпадение
)
Или лучше использовать
FIND_IN_SET-функцию
PHP:
->whereRaw('FIND_IN_SET(?,Tags)', [$colname])
->whereRaw("FIND_IN_SET(?, categories) > 0", [$q_category])
Тип поля ENUM использовать нет, возможности, т.к. в поле типа ENUM нужно перечислить жесткий список.

SQL:
CREATE TABLE tickets (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    priority ENUM('Low', 'Medium', 'High') NOT NULL
);
Code language: SQL (Structured Query Language) (sql)

The priority column will accept only three values Low, Medium and High. Behind the scenes, MySQL maps each enumeration member to a numeric index. In this case, Low, Medium, and High are map to 1, 2 and 3 respectively.
А страницы - это динамически каждый раз разное кол-во ID-шек.

Понимаю что это не революционность (реляционность) - но все же это связь... Какая?
 
Последнее редактирование:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Дерьмовая.

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

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Это не связь, повторяю еще раз. Если ты в поле запишешь json, или сериализованный массив - это просто способ хранения, а не тип связи M:1 или M:M.

Никто в здравом уме не будет связки обрабатывать лайком, особенно с двумя %
 

fixxxer

К.О.
Партнер клуба
Чтобы была связь, надо не только иметь возможность сделать выборку, но и иметь возможность обеспечить целостность средствами базы. Foreign key на эту хреновину ты никак не сделаешь.
 

StalkerClasses

Новичок
Чтобы была связь, надо не только иметь возможность сделать выборку, но и иметь возможность обеспечить целостность средствами базы. Foreign key на эту хреновину ты никак не сделаешь.
А если предположить что он не нужен.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Не предполагай подобное, нужен) Потому как потом без него у тебя будут очень веселые последствия
 

fixxxer

К.О.
Партнер клуба
«У нас есть поговорочка... Такая грубоватая, про бабушку, про дедушку. Если бы у бабушки были внешние половые органы дедушки, она была бы дедушкой, а не бабушкой». «Поэтому что там говорить», — заключил глава государства.
Да можешь хоть вообще все поля через запятую хранить. Только к реляционной модели данных это не имеет никакого отношения.
 

StalkerClasses

Новичок

fixxxer

К.О.
Партнер клуба
Денормализация делается намеренно, и всегда имеет четкое обоснование с точки зрения, например, производительности или особенностей архитектуры.

А просто так свалить через запятую и джойнить лайками - это не денормализация, это по-другому называется, но правила форума не позволяют озвучить точную формулировку.
 

StalkerClasses

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

А просто так свалить через запятую и джойнить лайками - это не денормализация, это по-другому называется, но правила форума не позволяют озвучить точную формулировку.
Посмотрел несколько примеров:


Полагаю это что-то более не в ту сторону чем мне нужно...
Мне нужно просто хранить и выбирать вот такой тип поля как M:M без промежуточной таблицы...
 

StalkerClasses

Новичок
У меня есть всего лишь два места (даже одно) где это актуально не с точки зрения связей....
 

Valick

Новичок
В большинстве случаев денормализация не отменяет хранение данных в нормальной форме, а выступает лишь дополнением.
Хранение данных через запятую (а это прямое нарушение первого закона нормализации, и как я всегда любою спрашивать "угадай почему это закон и почему он первый") попадает под вышеописанную ситуацию более чем полностью. И дело здесь даже не в целостности информации, а в том, что вы при таком хранении не сможете работать с данными на уровне СУРБД.
 

StalkerClasses

Новичок
В большинстве случаев денормализация не отменяет хранение данных в нормальной форме, а выступает лишь дополнением.
Хранение данных через запятую (а это прямое нарушение первого закона нормализации, и как я всегда любою спрашивать "угадай почему это закон и почему он первый") попадает под вышеописанную ситуацию более чем полностью. И дело здесь даже не в целостности информации, а в том, что вы при таком хранении не сможете работать с данными на уровне СУРБД.
Мне это нужно полагаю для EAV-сущеностей.
При EAV-вы можете хранить обычные поля. Но как быть со связями?
В битрикс это работает - у них есть связи для полей. В MODX TV поля тоже имеют кучу вариаций кроме связей.
 

AnrDaemon

Продвинутый новичок
Такого даже в вордпрессе сделать не додумались. Ты правда такой глупый, что слова "нет" не понимаешь?
 

WMix

герр M:)ller
Партнер клуба
прежде делают нормализацию а уже из нормальной формы тем же group_concat делается что ты хочешь.
запомни уже это называется M:N а не то как ты пишешь
SQL:
(
fieldpagestop = Like '5,%' OR // ищем в начале строки
fieldpagestop = Like '%,5' OR // ищем в конце строки
fieldpagestop = Like '%,5,%' OR // ищем в середине строки
fieldpagestop = 5 // ищем точное совпадение
)
3х OR и 2x like '%...' это бомбично.. совсем не уверен что это будет быстро
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
Последнее редактирование:
Сверху