Я хотел спросить вас, какой подход лучше всего подходит для создания моей структуры базы данных MySQL в следующем случае.
У меня есть таблица с items
, которую не нужно описывать, так как единственное важное поле здесь — это ID
.
Теперь я хотел бы иметь возможность назначать некоторые атрибуты каждому элементу - конечно, по его ID
. Но я точно не знаю, как это сделать, так как хотел бы, чтобы он был динамическим (поэтому мне не нужно изменять структуру таблицы, если я хочу добавить новый тип атрибута).
Что я думаю
Я думаю - и, на самом деле, это структура, которая у меня есть прямо сейчас - что я могу сделать таблицу items_attributes
со следующей структурой:
+----+---------+----------------+-----------------+
| id | item_id | attribute_name | attribute_value |
+----+---------+----------------+-----------------+
| 1 | 1 | place | Barcelona |
| 2 | 2 | author_name | Matt |
| 3 | 1 | author_name | Kate |
| 4 | 1 | pages | 200 |
| 5 | 1 | author_name | John |
+----+---------+----------------+-----------------+
Я привел данные в качестве примера, чтобы вы увидели, что эти атрибуты могут повторяться (это не отношение 1 к 1).
Проблема с этим подходом
Мне нужно сделать несколько запросов, некоторые из них для статистических целей, и если у меня много атрибутов для многих элементов, это может быть немного медленным.
Кроме того, может быть, потому, что я не эксперт по MySQL, каждый раз, когда я хочу выполнить поиск и найти «те элементы, у которых« место »=« Барселона »И« автор_имя »=« Джон »», мне в конечном итоге приходится делать несколько JOIN
для каждого условия.
Повторяя предыдущий пример, мой запрос будет выглядеть так:
SELECT *
FROM items its
JOIN items_attributes attr
ON its.id = attr.item_id
AND attr.attribute_name = 'place'
AND attr.attribute_value = 'Barcelona'
AND attr.attribute_name = 'author_name'
AND attr.attribute_value = 'John';
Как видите, это ничего не вернет, так как attribute_name
не может иметь два значения одновременно в одной строке, а условие OR
не будет тем, что я ищу, поскольку элементы ДОЛЖНЫ иметь оба значения атрибутов, как указано.
Таким образом, единственная возможность состоит в том, чтобы сделать JOIN
в одной и той же повторяющейся таблице для каждого условия поиска, что, я думаю, будет очень медленным, когда есть много терминов для поиска.
что бы я хотел
Как я уже сказал, я хотел бы иметь возможность сохранять динамические типы атрибутов, поэтому достаточно добавить новый ввод в «attribute_name» без необходимости добавления нового столбца в таблицу. Кроме того, поскольку они представляют собой отношения 1-N, их нельзя поместить в таблицу «элементы» в качестве новых столбцов.
Если структура, по вашему мнению, единственная, которая может удовлетворить мои интересы, если бы вы могли осветить некоторые идеи, чтобы поисковые запросы не были тонной JOIN
, это тоже было бы здорово.
Я не знаю, сложно ли это получить, так как я до сих пор ломал голову и не нашел решения. Надеюсь, вы, ребята, можете помочь мне с этим!
В любом случае, спасибо за ваше время и внимание!
С уважением.