morti
Новичок
Доброе время суток.
Созрел такой вопрос. Имеется: Запись (записей много, точно оценить не могу, но в тестовой модели их 100 000 в рабочей модели я думаю будет что то ... ну до миллиона)
Таблица записей
iden | record
Группа (групп меньше, в тестовой версии их порядка 200, ну думаю в рабочей дойдет до 1000 может чуть больше)
Таблица групп
iden | group
А так же есть таблица пользователи
Таблица пользователи
iden | user
Ну а весь вопрос в том как это все грамотно связать. А связываться должно следующее: Пользователь может иметь не ограниченное число групп. Группа может принадлежать не ограниченному числу пользователей. Запись может быть в не ограниченном числе групп
Путем теоретических изысканий вычленил для себя три подхода.
Вариант 1
В таблице записей добавляем поле group, в таблице group добавляем поле user. Добавляем записи, добавляем группы. В случае существования записи или группы, дублируем её с другим внешним ключем
Плюсы: скорость работы (так ли это?)
Минусы: избыточность, коряво смотрится все это ))
Вариант 2
Добавляем таблицу record_to_group
iden record group
Добавляем таблицу group_to_user
iden group user
ну дальше вроде должно быть все понятно
Плюсы: вроде приемлемо смотрится, но будет ли это быстро работать
Минусы: есть ещё сущности, их тоже надо будет связать, они меньше по количеству, по этому в задачу их не включил. количество таблиц со связками вырастет. будет ли все это вообще нормально работать
Вариант 3
Добавляем таблицу connect
iden object1 object2 iden1 iden2
Добавляем таблицу object
iden object
в данном случае в таблице object расписываем все сущности, типа:
1 record
2 group
3 user
в таблице connect делаем связки как хотим, думаю объяснять не надо
Плюсы: выглядит корректно, можно не ограниченно расширять
Минусы: тормозит, даже с расставленными индексами, хотя может книжку по расстановку индексов почитать ??? К примеру при 100000 записей и 100 группах пытаюсь вывести все группы с количество записей в них. Вывожу разными вариантами, через цикл 100 запросов, или один через COUNT + GROUP BY
Вариант 4 (смешанный)
Нагруженную часть реализовать через вариант 1, то есть таблицу с записями. Правда боюсь, что при расширении проекта там может быть пару миллионов записей из которых уникальных всего... миллион грубо говоря. (да учили базы правильно делать, вот и заморочился, да и нагрузка на проект может быть)
а остальные сделать по варианту 3
Думаю уже дня два Пока все реализовано по третьему варианту, но тормозит блин!
Заранее спасибо
Созрел такой вопрос. Имеется: Запись (записей много, точно оценить не могу, но в тестовой модели их 100 000 в рабочей модели я думаю будет что то ... ну до миллиона)
Таблица записей
iden | record
Группа (групп меньше, в тестовой версии их порядка 200, ну думаю в рабочей дойдет до 1000 может чуть больше)
Таблица групп
iden | group
А так же есть таблица пользователи
Таблица пользователи
iden | user
Ну а весь вопрос в том как это все грамотно связать. А связываться должно следующее: Пользователь может иметь не ограниченное число групп. Группа может принадлежать не ограниченному числу пользователей. Запись может быть в не ограниченном числе групп
Путем теоретических изысканий вычленил для себя три подхода.
Вариант 1
В таблице записей добавляем поле group, в таблице group добавляем поле user. Добавляем записи, добавляем группы. В случае существования записи или группы, дублируем её с другим внешним ключем
Плюсы: скорость работы (так ли это?)
Минусы: избыточность, коряво смотрится все это ))
Вариант 2
Добавляем таблицу record_to_group
iden record group
Добавляем таблицу group_to_user
iden group user
ну дальше вроде должно быть все понятно
Плюсы: вроде приемлемо смотрится, но будет ли это быстро работать
Минусы: есть ещё сущности, их тоже надо будет связать, они меньше по количеству, по этому в задачу их не включил. количество таблиц со связками вырастет. будет ли все это вообще нормально работать
Вариант 3
Добавляем таблицу connect
iden object1 object2 iden1 iden2
Добавляем таблицу object
iden object
в данном случае в таблице object расписываем все сущности, типа:
1 record
2 group
3 user
в таблице connect делаем связки как хотим, думаю объяснять не надо
Плюсы: выглядит корректно, можно не ограниченно расширять
Минусы: тормозит, даже с расставленными индексами, хотя может книжку по расстановку индексов почитать ??? К примеру при 100000 записей и 100 группах пытаюсь вывести все группы с количество записей в них. Вывожу разными вариантами, через цикл 100 запросов, или один через COUNT + GROUP BY
Вариант 4 (смешанный)
Нагруженную часть реализовать через вариант 1, то есть таблицу с записями. Правда боюсь, что при расширении проекта там может быть пару миллионов записей из которых уникальных всего... миллион грубо говоря. (да учили базы правильно делать, вот и заморочился, да и нагрузка на проект может быть)
а остальные сделать по варианту 3
Думаю уже дня два Пока все реализовано по третьему варианту, но тормозит блин!
Заранее спасибо