|
|
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
Всем привет! Есть новостной сайт. Он содержит новости, пользовательские комментарии к ним и различные досье. В дальнейшем будут и другие объекты. Необходимо разработать механизм голосований, чтобы можно было бы голосовать и за новости, и за комментарии, и за различные досье. Как это можно правильно спроектировать? Первое, что идем на ум: Код: plaintext 1. 2. 3. 4. 5. 6. Здесь MARK_TYPE - это селектор, который определяет, за что голосовали, NEWS_ID, COMMENT_ID и DOSSIER_ID - это внешние ключи на таблицы новостей, комментариев или досье соответственно, MARK - собственно оценка (от 1 до 5, например). Таким образом, есть MARK_TYPE равно один, например, то приложения знают, что нужно читать идентификатор внешнего ключа с NEWS_ID и делать соединение с NEWS, если что; если MARK_TYPE равно два, то приложения знают, что нужно читать идентификатор для внешнего ключа с COMMENT_ID и джойниться с COMMENTS, и т.д. Соответственно, программный компонент "отображение среднего бала" будет иметь настройку, и в соответствие с ней рассчитывать оценку за текущий материал/комментарий/досье. Правильная ли такая схема данных для моей ситуации? Или можно сделать как-то красивее? Всем заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2008, 18:34 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
Смущает еще то, что если придется оценивать другие объекты БД, например авторов текстов, то нужно будет добавлять еще одну колонку и внешний ключ в таблицу MARKS. Правильно ли это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 15:05 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
Елси MARK_TYPE уже есть тогда не нужно разделение на NEWS_ID,COMMENT_ID,DOSSIER_ID, пусть это будет общий ENTITY_ID, все равно будет условие по двум полям MARK_TYPE и ID при соединении с контентной таблицой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 17:20 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
да и на (MARK_TYPE, ENTITY_ID ) повесить юник индекс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 17:22 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
BrigadeFuhrerЕлси MARK_TYPE уже есть тогда не нужно разделение на NEWS_ID,COMMENT_ID,DOSSIER_ID, пусть это будет общий ENTITY_ID, все равно будет условие по двум полям MARK_TYPE и ID при соединении с контентной таблицой Спасибо! Это хорошо при условии, что все PK во внешних таблицах имеют один тип данных (в данном случае INT). А как быть, если, например, в каких-нибудь таблицах будет PK числом, в некоторых строкой а в некоторых, например, датой? Делать по полю на каждый тип первичного ключа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 17:27 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
Vetal BrigadeFuhrerЕлси MARK_TYPE уже есть тогда не нужно разделение на NEWS_ID,COMMENT_ID,DOSSIER_ID, пусть это будет общий ENTITY_ID, все равно будет условие по двум полям MARK_TYPE и ID при соединении с контентной таблицой Спасибо! Это хорошо при условии, что все PK во внешних таблицах имеют один тип данных (в данном случае INT). А как быть, если, например, в каких-нибудь таблицах будет PK числом, в некоторых строкой а в некоторых, например, датой? Делать по полю на каждый тип первичного ключа? а есть такие таблицы? если нет ,то плюнуть на это. сложно представить какой-любо другой тип пк для контент таблиц. не ну можно делать по теории - общая таблица голосов связывается через таблицу пересечения с контент таблицей, итого на каждую сцщность будет джойтится 3 таблицы - голоса, голоса_сущности, сущность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2008, 17:51 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
BrigadeFuhrerне ну можно делать по теории - общая таблица голосов связывается через таблицу пересечения с контент таблицей, итого на каждую сцщность будет джойтится 3 таблицы - голоса, голоса_сущности, сущность.То-есть, связь многие-ко-многим? А зачем она нужна? Ведь один голос может быть предназначен только за один материал/досье/комментарий... Тут само собой напрашивается связь один-ко-многим... Или я чего не понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2008, 10:56 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
VetalЗдесь MARK_TYPE - это .... это лишнее поле, годное только усложнять запросы и провоцировать извраты .... VetalТаким образом, есть MARK_TYPE равно один, например, то приложения знают, что нужно читать идентификатор внешнего ключа с NEWS_ID и делать соединение с NEWS, .... типа, например, описанного. В то время как достаточно просто сджойнить по news_id. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2008, 11:08 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
softwarer VetalЗдесь MARK_TYPE - это .... это лишнее поле, годное только усложнять запросы и провоцировать извраты .... VetalТаким образом, есть MARK_TYPE равно один, например, то приложения знают, что нужно читать идентификатор внешнего ключа с NEWS_ID и делать соединение с NEWS, .... типа, например, описанного. В то время как достаточно просто сджойнить по news_id. и тогда понять, к какому типу относится коммент, можно по тому, поле для какого внешнего ключа не null? А какое тогда решение все же лучше? 1) только что предложенное, когда нет селектора MARK_TYPE, и просто джойнится нужная таблица с оценкой по соответствующему внешнему ключу, и в таблице MARK столько же внешний ключей, сколько и возможных объектов-таблиц, за которые можно проголосовать 2) ранее предложенное, когда есть только одно поле типа Object_Id и селектор MARK_TYPE для того, чтобы знать с какой таблицей джойниться ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2008, 12:12 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
3) несколько однотипных таблиц на каждый ресурс по отдельности ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2008, 12:18 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
Vetal1) только что предложенное, когда нет селектора MARK_TYPE, и просто джойнится нужная таблица с оценкой по соответствующему внешнему ключу, и в таблице MARK столько же внешний ключей, сколько и возможных объектов-таблиц, за которые можно проголосовать А зачем нужен соответствующий ключ? Просто одно поле с внешним ключом на ID объекта. А ID всех объектов уникальны, за счет выделения непересекающихся множеств значения для однородных объектов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2008, 12:22 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
egorych3) несколько однотипных таблиц на каждый ресурс по отдельностиИ что, так будет лучше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2008, 13:00 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
474А зачем нужен соответствующий ключ? Просто одно поле с внешним ключом на ID объекта. А ID всех объектов уникальны, за счет выделения непересекающихся множеств значения для однородных объектов.И что, так будет лучше? А если появится новая таблица, то что - у всех таблиц менять итервалы ключей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2008, 13:02 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
Vetal 474А зачем нужен соответствующий ключ? Просто одно поле с внешним ключом на ID объекта. А ID всех объектов уникальны, за счет выделения непересекающихся множеств значения для однородных объектов.И что, так будет лучше? А если появится новая таблица, то что - у всех таблиц менять итервалы ключей? Вы теоретизируете или вопрос имеет практическое значение? Если это практика, то это все решается. Например самое простое решение - сделайте интервалы с запасом. Добавьте в начало ключа разряды на новые таблицы. 100 0000000000000001 – первая запись в первой таблице 200 0000000000000001 - первая запись во второй таблице NNN 0000000000000001 - первая запись во NNN таблице ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2008, 13:14 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
М.б., что-нибудь такого плана... Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. Делаем справочник типов объектов (OBJECTTYPE). И единую таблицу для всех объектов (OBJECTSLIST). Таблицы с объектами конкретных типов на нее ссылаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2008, 13:31 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
Vetalи тогда понять, к какому типу относится коммент, можно по тому, поле для какого внешнего ключа не null? Фокус в том, что "понимать" это чаще всего не требуется вообще. Чаще всего требуется просто вывести записи по имеющемуся мастеру. А так - да, именно по not null. Vetal2) ранее предложенное, когда есть только одно поле типа Object_Id и селектор MARK_TYPE для того, чтобы знать с какой таблицей джойниться Хм. Скажем так, я по цензурным соображениям не хочу говорить того, что думаю об этом варианте, но в целом я считаю его крайне неудачным. Если существующие БД обзаведутся возможностью вменяемо поддерживать foreign key в таких случаях - можно будет говорить о том, что решение в принципе жизнеспособно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2008, 13:40 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
Золотая рыбкаМ.б., что-нибудь такого плана... Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. Делаем справочник типов объектов (OBJECTTYPE). И единую таблицу для всех объектов (OBJECTSLIST). Таблицы с объектами конкретных типов на нее ссылаются.А чем это решение принципиально отличается от того, что я вначале предложил? В чем преимущество именно этого подхода? Мне кажется, так только усложняется схема данных и работа с ними... Или я все же ошибаюсь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2008, 15:40 |
|
||
|
Помогите правильно спроектировать изменения в схеме данных
|
|||
|---|---|---|---|
|
#18+
Код: plaintext Таким образом для добавления нового типа объекта достаточно создать новую таблицу (скажем, AUTHORS - также с FK на OBJECTSLIST) и добавить соответствующую запись в справочник типов. Новые колонки в таблицу MARKS не добавляются. При этом сохранится контроль за ссылочной целостностью, что, к сожалению, невозможно, если использовать вариант Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2008, 16:25 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35330600&tid=1543857]: |
0ms |
get settings: |
12ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
194ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
2ms |
| others: | 244ms |
| total: | 569ms |

| 0 / 0 |
