Одна или несколько таблиц для связей - что лучше?

svirol

Новичок
Одна или несколько таблиц для связей - что лучше?

Тут возник спор, может, и не очень умный, но мы разрешить не можем. При связях многие - ко многим мы создаем отдельную таблицу связей. Что проще - создать для каждой связи новые таблицы или одну таблицу со столбцом, указывающим, что это за связь? То есть несколько таблиц, например статьи-навигация, картинки-новости или все свести в одну таблицу, указывая в дополнительном столбце, что это за связь. Что разумнее, что быстрее будет работать?
 

Demiurg

Guest
Обычно всегда на одну связь создается по одной таблице. Не зная полностью задачи больше трудно что либо сказать.
 

fisher

накатила суть
имхо вопрос имеет смысл, когда речь идет о такой ситуации
MASTER<->SLAVE1
MASTER<->SLAVE2
MASTER<->SLAVE3,
(то есть не абстрактная связь а на одном конце одна сущность),
и _часто_ необходимо при поднятии списка MASTER поднимать _все_ подчиненые. если включить всё в одну таблицу, мы увеличиваем быстройдействие но теряем на хрен целостность (можем обеспечивать её только триггерами). в обратном случае теоретически всё "правильнее", но из-за многих джойнов получим бОльшие тормоза. что выбрать - зависит ессно от конкретного примера, причем не только дизайна но и прочих услови (какая ожидается нагрузка, объем данных и т.д.)
 

Demiurg

Guest
fisher, то, что ты пытался назвать slave обычно называют справочником и пихают в одну таблицу.
 

fisher

накатила суть
demiurg, да причем тут справочник, ты не понял. чтоб не быть голословным, характерная модель: тема,новости,картинки,видео. три последние сущности связаны с темой, причем связь одинакова: просто два внешних ключа с одинаковым набором атрибутов. теоретически грамотно - 7 таблиц. а практически в ряде специфических случаев может оказаться правильнее 5, иметь одну таблицу связей.
 

Demiurg

Guest
нука опиши таблицы в предлагаемой тобой модели.
 

fisher

накатила суть
demuirg, мы так засорим тред :) вкратце - те же два внешних ключа со своими атрибутами + код подчиненной таблицы, именно то, о чем спрашивал
svirol. то есть напрочь становится нарушена целостность (я например так никогда не делаю). но когда связей много и их надо поднимать все - число запросов растет пропорционально числу связей, поэтому можно выиграть. я никоим образом не агитирую, просто подчеркнул что это единственный на мой взгляд случай, когда вопрос svirol'а вообще имеет смысл. в противном случае надо без раздумья делать по-правильному - по таблице на связь. пусть автор вопроса пояснит свою модель, тогда можно уже говорить более предметно. если честно с темами - пример не самый удачный. более интересный вариант применения этого безобразия - индексирование сущностей в поисковике (вместо урла пара код таблица - первичный ключ)
 

Demiurg

Guest
не засорим, не бойся.
если надо много постить есть php.kz/paste/
 

fisher

накатила суть
так я ж объяснил уже? пусть svirol скажет, что ему надо - а то мы так в дебри зайдем, нам-то чего спорить. пример с поисковиком более явный - так что для него, в псевдо-коде будет что-нибудь такое

idxsearch:
keyword (или fk id_keywordна словарь он же справочник ;), не суть )
weight int
object_table varchar
object_id

сколько бы ни было типов индексированных объектов (то бишь вообще-то тех же связей) мы всегда имеем одну таблицу связи "ключевое слово - объект" со всеми вытекающими.
 

fisher

накатила суть
create table idxsearch (
keyword varchar(255),
weight unsigned int,
object_table varchar2(32),
object_id unsigned int
);

insert into idxsearch values
('абрамович',1,'interview',21),
('челси',10,'interview',21),
('абрамович',100,'person',32),
('абрамович',20,'news',23)
...
;

interview,person,news - какие-то другие таблицы, это не важно. таблица idxsearch - классический пример пихания разных типов связей в одну таблицу с учетом специфики задачи
 

fisher

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

Demiurg

Guest
Если ты говоришь о поиске, то в вебе обычно индексируются страницы, и в индуксе не нужны ни названия таблицы ни чего прочего, нужен только урл страницы и все. Других примеров я пока не видел.
 

fisher

накатила суть
именно поэтому иногда, глядя на результаты поиска, мы говорим: "ну и помойка" ;) целесообразно вместо урла иметь пару таблица-ключ если я поиск осуществляю именно _не_ по каким-то абстрактным страницам, на которых встретилось данное слово. весьма распространенная вещь.
 

Demiurg

Guest
причем тут помойка ? ты что действительно делаешь так поиск ?
 

fisher

накатила суть
2Demiurg: чтобы не засорять эту тему я создал офтопик
http://www.phpclub.net/talk/showthread.php?s=&threadid=40554&rand=0
 
Сверху