Правильная реализация связывания таблиц

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

Думаю уже дня два :) Пока все реализовано по третьему варианту, но тормозит блин!
Заранее спасибо :)
 

Redjik

Джедай-мастер
Почитай про many-to-many
И разбивай текст на логические абзацы.

А не

Каждое предложение

С новой строки
 

morti

Новичок
Полет мысли был :) Убрал лишние переносы. Пойду почитаю. Но думаю там будет тоже самое что я описал.

Скажем так. Судя по всему Иван не прочитал, то что я писал. А я не до конца объяснил.

Мне известны варианты реализации. Какой из вариантов будет устойчиво работать при повышенной нагрузке?
 

prolis

Новичок
второй вариант достаточен, дальше можно было не копать
 

zerkms

TDD infected
Команда форума
morti
К примеру при 100000 записей и 100 группах пытаюсь вывести все группы с количество записей в них. Вывожу разными вариантами, через цикл 100 запросов, или один через COUNT + GROUP BY
потому что такие вещи нужно хранить предрасчитанными рядом с данными (обновлять по расписанию или триггерами). В твоём случае - число записей в группе это столбец records_count в таблице group
 

morti

Новичок
Все таки получается, вариант 2.

потому что такие вещи нужно хранить предрасчитанными рядом с данными (обновлять по расписанию или триггерами). В твоём случае - число записей в группе это столбец records_count в таблице group
по мне так это жестковато в данном случае, с сильно нагруженными проектами не работал, там такая схема конечно подойдет. а здесь достаточно будет выбрать оптимальный вариант реализации связок

пойду тестировать вариант 2
 
Сверху