|
|
|
EAV или мультитабличность?
|
|||
|---|---|---|---|
|
#18+
Есть задача дать возможность пользователям создавать и заполнять много форм с произвольными полями и значениями. В голову пришло только создавать отдельные таблицы под каждую форму. На одном сайте подсказали смотреть в сторону реализации EAV. Покурив литературу, пришёл к выводу, что это действительно простое решение. Осталось всего несколько вопросов: 1. Масштабируемость 2. Скорость выборки. С первым пока заниматься рано, но хотелось бы выслушать ваши мнения на этот счёт, а вот второе вызывает много вопросов. Хотелось бы протестировать. Например выбрать по 10 разным параметрам из таблицы в 10 млн строк. Остановимся пока на идеальном случае с целыми числами (integer). Структура таблицы следующая Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. SELECT user_id FROM table LEFT JOIN table ON field_id = 1 and field_value = 3 LEFT JOIN table ON field_id=2 and field_value = 8 В join запросах я не силён, поэтому прошу помощи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2013, 22:36:12 |
|
||
|
EAV или мультитабличность?
|
|||
|---|---|---|---|
|
#18+
Запросы могут быть и без JOIN, на основе GROUP BY ... HAVING COUNT(*)= ... А вообще эффективность EAV очень сильно зависит от тонкостей предметной области, от того, какие именно запросы придется выполнять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2013, 23:11:30 |
|
||
|
EAV или мультитабличность?
|
|||
|---|---|---|---|
|
#18+
Alex Rengen1. Масштабируемость 2. Скорость выборки. 1. = перевёрнутой 8 2. = й.стыду "не очень" автор С первым пока заниматься рано, но хотелось бы выслушать ваши мнения на этот счёт, а вот второе вызывает много вопросов. Хотелось бы протестировать. Например выбрать по 10 разным параметрам из таблицы в 10 млн строк. Остановимся пока на идеальном случае с целыми числами (integer). Структура таблицы следующая Код: plaintext 1. ...Нужно создать запрос вроде такого: Код: sql 1. 2. 3. В join запросах я не силён, поэтому прошу помощи. нуу, LEFT JOIN, для начала, - тут не приделах, - нужен INNER а вообще, есть "универсальный" вариант Код: sql 1. 2. 3. 4. 5. 6. и возвращаясь к "началам" авторЕсть задача дать возможность пользователям создавать и заполнять много форм с произвольными полями и значениями. каких, нахрен "форм" ??! "пользовательский интерфейс" - это что-то "одно", а структура БД - "что-то другое" никогда нельзя идти на "уродование" структуры БД, из-за ЮИ !! НИКОГДА ! авторВ голову пришло только создавать отдельные таблицы под каждую форму. нуу, а это просто - й.стыд без комментариев ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2013, 23:20:26 |
|
||
|
EAV или мультитабличность?
|
|||
|---|---|---|---|
|
#18+
авторЗапросы могут быть и без JOIN, на основе GROUP BY ... HAVING COUNT(*)= ... А вообще эффективность EAV очень сильно зависит от тонкостей предметной области, от того, какие именно запросы придется выполнять. Насчёт GROUP BY ... HAVING COUNT(*)= ... спасибо, внесу в список для тестов. Запросы простые - обрабатывать поиск по множеству разных полей формы, которые заполняют пользователи. Возвращать значение user_id - для которых найдено полное соответствие запросу. qwerty112нуу, LEFT JOIN, для начала, - тут не приделах, - нужен INNER а вообще, есть "универсальный" вариант Код: sql 1. 2. 3. 4. 5. 6. Да, Кэп, но в этом случае мы получим всех пользователей, у которых есть хоть одно совпадение по любому полю. А нужно получить только те user_id для которых совпадение по всем полям. Покажите, пожалуйста, свой вариант на INNER. qwerty112и возвращаясь к "началам" авторЕсть задача дать возможность пользователям создавать и заполнять много форм с произвольными полями и значениями. каких, нахрен "форм" ??! "пользовательский интерфейс" - это что-то "одно", а структура БД - "что-то другое" никогда нельзя идти на "уродование" структуры БД, из-за ЮИ !! НИКОГДА ! Я что-то писал про UI? Просто образно описал задачу для лучшего понимания предмета обсуждения. Если бы не написал, то первым постом было бы "А зачем это нужно?" qwerty112авторВ голову пришло только создавать отдельные таблицы под каждую форму. нуу, а это просто - й.стыд без комментариев ... Первым приходит самое простое решение, мне за него не стыдно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 00:37:23 |
|
||
|
EAV или мультитабличность?
|
|||
|---|---|---|---|
|
#18+
Alex Rengenqwerty112нуу, LEFT JOIN, для начала, - тут не приделах, - нужен INNER а вообще, есть "универсальный" вариант Код: sql 1. 2. 3. 4. 5. 6. Да, Кэп, но в этом случае мы получим всех пользователей, у которых есть хоть одно совпадение по любому полю. А нужно получить только те user_id для которых совпадение по всем полям. "д-ма на лопате" (с) Alex RengenПокажите, пожалуйста, свой вариант на INNER. Код: sql 1. 2. 3. 4. Alex Rengenqwerty112и возвращаясь к "началам" пропущено... каких, нахрен "форм" ??! "пользовательский интерфейс" - это что-то "одно", а структура БД - "что-то другое" никогда нельзя идти на "уродование" структуры БД, из-за ЮИ !! НИКОГДА ! Я что-то писал про UI? Просто образно описал задачу для лучшего понимания предмета обсуждения. Если бы не написал, то первым постом было бы "А зачем это нужно?" . что такое "заполнять много форм" ? что ты называешь "формой" ? может для тебя это что-то "своё", - для меня "форма" - элемент пользовательского интерфейса, не больше, но и не меньше ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 00:51:00 |
|
||
|
EAV или мультитабличность?
|
|||
|---|---|---|---|
|
#18+
qwerty112что такое "заполнять много форм" ? что ты называешь "формой" ? может для тебя это что-то "своё", - для меня "форма" - элемент пользовательского интерфейса, не больше, но и не меньше ... Спасибо за пример с INNER. Что вы докопались до этих форм, сказано что все данные integer Даже для абстрактных моделей существуют примеры бытового применения для лучшего "осязания" объекта изучения. Формы в данном случае служат источником данных, они же являются инициатором запроса (поисковая форма). Те же поля из формы соотносятся с Field_id таблицы. И данные введёные в это поле будут записаны в field_value это всё что нужно знать про формы. И я не пытаюсь интерфейс привязать к Mysql, это абсурд, если знаете пример такого, я бы с интересом взглянул. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 02:18:43 |
|
||
|
EAV или мультитабличность?
|
|||
|---|---|---|---|
|
#18+
Alex RengenЧто вы докопались до этих форм, сказано что все данные integer ... я на этой фразе "споткнулся", и всё никак не могу двинуться дальше ... какая связь между "формы" и "тип данных" ... ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 02:24:44 |
|
||
|
EAV или мультитабличность?
|
|||
|---|---|---|---|
|
#18+
Alex RengenДаже для абстрактных моделей существуют примеры бытового применения для лучшего "осязания" объекта изучения. Формы в данном случае служат источником данных, они же являются инициатором запроса (поисковая форма). Те же поля из формы соотносятся с Field_id таблицы. И данные введёные в это поле будут записаны в field_value это всё что нужно знать про формы. И я не пытаюсь интерфейс привязать к Mysql, это абсурд, если знаете пример такого, я бы с интересом взглянул. опишите вообще задачу ! "бизнес-процесс" тыксказать ... об чём ваще речь ? какое / на чём планируется клиентское приложение ... ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 02:30:04 |
|
||
|
EAV или мультитабличность?
|
|||
|---|---|---|---|
|
#18+
>> Есть задача дать возможность пользователям создавать и заполнять много форм с произвольными полями и значениями. для начала : EAV -- а там глядишь, может и приживется >> В голову пришло только создавать отдельные таблицы под каждую форму. попробуйте, посоздавайте, в чем проблема протестировать идею? >> Масштабируемость уже сказали -- безгранична >> Скорость выборки. уже 10 раз сказали -- уточните, что, зачем и с какой скоростью надо. Вообше, скорость выборки конечно дело серьезное, но сложность ЕАВ не в этом а в отсутствие "механической" и "логической" структуры. Вот вы програмируете на каком-нибудь ООП языке? Если да, то уберите на это языке способность задавать классы и оставить бесформеные мешки пар ключ-значение. Конечно сравнить класс с таблице -- немного притянуто, но а бы поможет понять проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2013, 07:11:02 |
|
||
|
EAV или мультитабличность?
|
|||
|---|---|---|---|
|
#18+
javajdbc>> Есть задача дать возможность пользователям создавать и заполнять много форм с произвольными полями и значениями. для начала : EAV -- а там глядишь, может и приживется >> В голову пришло только создавать отдельные таблицы под каждую форму. попробуйте, посоздавайте, в чем проблема протестировать идею? >> Масштабируемость уже сказали -- безгранична >> Скорость выборки. уже 10 раз сказали -- уточните, что, зачем и с какой скоростью надо. Вообше, скорость выборки конечно дело серьезное, но сложность ЕАВ не в этом а в отсутствие "механической" и "логической" структуры. Вот вы програмируете на каком-нибудь ООП языке? Если да, то уберите на это языке способность задавать классы и оставить бесформеные мешки пар ключ-значение. Конечно сравнить класс с таблице -- немного притянуто, но а бы поможет понять проблему. Да, программирую на C++ и PHP, и понимаю о чём вы. В конце-концов запросы создаются автоматически, в этом нет проблемы. Mysql просто не оптимальный вариант для использования в EAV архитектуре, возможно лучше использовать какое-нибудь MongoDB. Опробовал с БД в 20 млн записей (Mysql MyISAM). Минимальное время обработки простого запроса. "select user_id where" с одним условием "field_id = x and value_id = y" составило 1 сек, добавил уточняющее поле template_id чтобы выборка была только по отдельному шаблону, время выборки сократилось до 0,13 сек. Подозреваю, что с более сложными запросами inner join или having count не ускорит процесс. Все поля проиндексированы, кеш БД был расширен чтобы вместить весь индекс 750Мб. Железо core i5 16Gb RAM, 250 Gb SSD. Требуется добиться выборки максимум за 0,01 сек, что получилось используя отдельные таблицы (даже меньше 0,001 сек.). Вообщем архитектура EAV не для моих задач, лучше использовать отдельные таблицы под каждый шаблон. EAV в свою очередь можно было бы использовать при условии небольших проектов в таблицах до 1 млн записей или если время ответа не критично. Всем спасибо за участие в обсуждении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2013, 15:57:31 |
|
||
|
EAV или мультитабличность?
|
|||
|---|---|---|---|
|
#18+
Alex RengenОпробовал с БД в 20 млн записей (Mysql MyISAM). Минимальное время обработки простого запроса. "select user_id where" с одним условием "field_id = x and value_id = y" составило 1 сек, добавил уточняющее поле template_id чтобы выборка была только по отдельному шаблону, время выборки сократилось до 0,13 сек.Если не будет лень - показывайте подробности, посмотрим что можно сделать. Мне в свое время удалось получить сравнимый результат на заметно худшем железе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2013, 17:41:37 |
|
||
|
EAV или мультитабличность?
|
|||
|---|---|---|---|
|
#18+
miksoftAlex RengenОпробовал с БД в 20 млн записей (Mysql MyISAM). Минимальное время обработки простого запроса. "select user_id where" с одним условием "field_id = x and value_id = y" составило 1 сек, добавил уточняющее поле template_id чтобы выборка была только по отдельному шаблону, время выборки сократилось до 0,13 сек.Если не будет лень - показывайте подробности, посмотрим что можно сделать. Мне в свое время удалось получить сравнимый результат на заметно худшем железе. Даже если результат улучшить в десять раз, это не станет решением, поскольку тестовый запрос на порядок проще того, что должен обрабатываться за сотые доли секунды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2013, 19:53:26 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=193&tid=1835464]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
43ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 375ms |

| 0 / 0 |
