|
|
|
Многократные связи между двумя таблицами через другие таблицы
|
|||
|---|---|---|---|
|
#18+
Всем здравствуйте! Проектирую базу данных новостийного портала. Портал будет состоять из нескольких новостийных сайтов. Каждый сайт ( Site ) будет содержать свои типы новостей ( NewsType ) (новости, фоторепортажи, интервью, анонсы и т.п.) и свои рубрики ( Rubric ) (политика, спорт, общество и т.п.). Соответственно, каждая новость ( News ) будет классифицироваться как по типам новостей, так и по рубрикам. Исходя из этого, вот концептуальная схема данных: концептуальная схема данных(25Kb) Здесь я использовал зависимую связь таблиц NewsType и Rubric от таблицы Site , потому что натуральные ключи типов новостей и рубрик уникальны только в пределах каждого сайта. Вот физическая схема данных: физическая схема данных(28Kb) Что меня смущает: во-первых: мне не нравится на концептуальном уровне, что News ненапрямую зависит от Site как через NewsType , так и через Rubric . Таким образом, теоретически может быть возможность, что для некоторой новости ее тип новости будет принадлежать одному сайту, а рубрика другому сайту. Вместе с тем, мне нужно в некоторых местах выполнять запросы, получающие перечень всех рубрик для данного сайта, и то же самое и для типов новостей. Таким образом, типы новостей и рубрики могут существовать независимо от того, есть в них новости или нет. во-вторых: на физическом уровне в таблице News получается два атрибута, обозначающих идентификатор сайта: rubric_site_site_id и newstype_site_site_id . Что, как по мне, явная избыточность в пределах одной таблицы. В общем, прошу обсудить, нормально ли спроектированы взаимосвязи исходя из требований предметной логики? Или можно было-бы спроектировать базу оптимальней? Всем заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 15:42 |
|
||
|
Многократные связи между двумя таблицами через другие таблицы
|
|||
|---|---|---|---|
|
#18+
VetalВсем здравствуйте! во-первых: мне не нравится на концептуальном уровне, что News ненапрямую зависит от Site как через NewsType, так и через Rubric. Таким образом, теоретически может быть возможность, что для некоторой новости ее тип новости будет принадлежать одному сайту, а рубрика другому сайту. Дык а зачем вы так сделали? Замените связи NewsType_Site и Rubric_Site которые сейчас 1-ко-многим, на связи многие-ко-многим. Соответственно развертываем связи многие-ко-многим и получаем две новые таблицы только с идентификаторам - SiteNewsTypes и SiteRubrics. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 16:45 |
|
||
|
Многократные связи между двумя таблицами через другие таблицы
|
|||
|---|---|---|---|
|
#18+
Подумайте также может стоит новости, фоторепортажи, интервью, анонсы и т.п сделать подтипами некоторого общего предка "абстрактная статья", т.е. реализовать наследование в виде связи 1-к-1. По крайней мере на первоначальном этапе проектирования не рекомендуется сводить подтипы в одну сущность с признаком типа. Скорее всего атрибуты фоторепортажа будут иными чем у обычной новости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 16:51 |
|
||
|
Многократные связи между двумя таблицами через другие таблицы
|
|||
|---|---|---|---|
|
#18+
Роман ДынникДык а зачем вы так сделали? Замените связи NewsType_Site и Rubric_Site которые сейчас 1-ко-многим, на связи многие-ко-многим. Соответственно развертываем связи многие-ко-многим и получаем две новые таблицы только с идентификаторам - SiteNewsTypes и SiteRubrics. А зачем? Если у меня на один сайт много рубрик но каждая из рубрик может принадлежать только одному сайту? Тут явно получается один-ко-многим. А многие-ко-многим же позволит одну и ту же рубрику размещать на нескольких сайтах, что недопустимо. Мне кажется, это уже проект базы, в которой структура допускает создать такую зависимость, которой не должно быть. Кроме того, при джойне всех этих таблиц с теми двумя, которые Вы предлагаете, мы снова же можем получить ситуацию, когда новость связана и с одним сайтом, и с другим, потому что соответствующая запись в NewsType связана с одним сайтом, а в Rubric - с другим. Кроме того, у меня ж в таблицах NewsType и Rubric ключи были составные, и первые их атрибуты являются ключом таблицы Site. Мне что, в Вашем случае необходимо создавать суррогатный ключ в таблицах Rubric и NewsType? Если да, то я ж могу их и так создать без этих двух таблиц связей, тогда у меня site_id не будет мигрировать в таблицу News. Разьясните, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 17:36 |
|
||
|
Многократные связи между двумя таблицами через другие таблицы
|
|||
|---|---|---|---|
|
#18+
Роман ДынникПодумайте также может стоит новости, фоторепортажи, интервью, анонсы и т.п сделать подтипами некоторого общего предка "абстрактная статья", т.е. реализовать наследование в виде связи 1-к-1. По крайней мере на первоначальном этапе проектирования не рекомендуется сводить подтипы в одну сущность с признаком типа. Скорее всего атрибуты фоторепортажа будут иными чем у обычной новости. Скорее всего да, аттрибуты будут разные. При этом если таблица содержит 25 различных типов новостей, то мне получается нужно создать 25+1 таблиц. При этом придется делать джойн больших таблиц, в моем случае до миллиона записей, когда можно было бы обойтись и без этого джойна, если все будет в одной таблице. Это сказывается на производительности. При этом часть атрибутов есть общими для многих типов новостей, часть нет. Это дает свои сложности при программировании предметной логики на аппликейшн сервере. Обьясните пожалуйста, чем ваше предложение лучше? Я хочу понять, может, я и ошибаюсь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 17:40 |
|
||
|
Многократные связи между двумя таблицами через другие таблицы
|
|||
|---|---|---|---|
|
#18+
Vetalво-первых: мне не нравится на концептуальном уровне, что News ненапрямую зависит от Site как через NewsType , так и через Rubric . Таким образом, теоретически может быть возможность, что для некоторой новости ее тип новости будет принадлежать одному сайту, а рубрика другому сайту. Вместе с тем, мне нужно в некоторых местах выполнять запросы, получающие перечень всех рубрик для данного сайта, и то же самое и для типов новостей. Таким образом, типы новостей и рубрики могут существовать независимо от того, есть в них новости или нет. во-вторых: на физическом уровне в таблице News получается два атрибута, обозначающих идентификатор сайта: rubric_site_site_id и newstype_site_site_id . Что, как по мне, явная избыточность в пределах одной таблицы. Все верно замечено - rubric_site_site_id и newstype_site_site_id должны быть одни атриьутом, участвующим в двух связях. Роман ДынникЗамените связи NewsType_Site и Rubric_Site которые сейчас 1-ко-многим, на связи многие-ко-многим.?? По идее автора новость находится на одном сайте, в единственной рубрике и имеет единственный тип. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 17:41 |
|
||
|
Многократные связи между двумя таблицами через другие таблицы
|
|||
|---|---|---|---|
|
#18+
Vetal А зачем? Если у меня на один сайт много рубрик но каждая из рубрик может принадлежать только одному сайту? Тут явно получается один-ко-многим. А многие-ко-многим же позволит одну и ту же рубрику размещать на нескольких сайтах, что недопустимо. Мне кажется, это уже проект базы, в которой структура допускает создать такую зависимость, которой не должно быть. Решается введением альтернативного ключа по идентификатору рубрики и сайту. Кроме того, при джойне всех этих таблиц с теми двумя, которые Вы предлагаете, мы снова же можем получить ситуацию, когда новость связана и с одним сайтом, и с другим, потому что соответствующая запись в NewsType связана с одним сайтом, а в Rubric - с другим. Имхо, это проконтролирвать надо на уровне бизнес-логики. Vetal Кроме того, у меня ж в таблицах NewsType и Rubric ключи были составные, и первые их атрибуты являются ключом таблицы Site. Мне что, в Вашем случае необходимо создавать суррогатный ключ в таблицах Rubric и NewsType? Да, создать суррогатный и не увлекаться особо естественными. автор?? По идее автора новость находится на одном сайте, в единственной рубрике и имеет единственный тип. Видимо так. тогда чего проще - Сайт<-рубрика<-новость + сайт-допустимые типы новостей. А контролировать допустимость ввода новости с конкретным типом - на уровне бизнес-логики. авторПри этом если таблица содержит 25 различных типов новостей, то мне получается нужно создать 25+1 таблиц. При этом придется делать джойн больших таблиц, в моем случае до миллиона записей, когда можно было бы обойтись и без этого джойна, если все будет в одной таблице. Это сказывается на производительности. А вы думаете смещение модели в сторону EAV менее скажется в производительности? По крайней мере модель на наследовании будет поддаваться оптимизации и легкому перепроектированию для повышения производительности, а EAV - уже нет. И JOIN тут как раз даже может увеличить производительнось впротивовес тому, если бы у вас существовала одна таблица на миллионы записей. авторПри этом часть атрибутов есть общими для многих типов новостей, часть нет. Это дает свои сложности при программировании предметной логики на аппликейшн сервере. обобщение до одной таблицы дает намного больше проблем в реализации бизнес-объектов. И напротив, наследуемость классов, гораздо упрощает ее. авторОбьясните пожалуйста, чем ваше предложение лучше? Я хочу понять, может, я и ошибаюсь... Оно не лучше, просто это позволяет при концептуальном моделировании выявить все сущности (если это ,конечно, возможно на этапе проектирования) и избежать возможных ошибок проектирования. Впоследствии, если модель окажется простой, схема может свестись к первоначально вами предложенному использованию идентификатора типа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2007, 18:53 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=125&tid=1544748]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 358ms |

| 0 / 0 |
