powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Помогите правильно спроектировать изменения в схеме данных
18 сообщений из 18, страница 1 из 1
Помогите правильно спроектировать изменения в схеме данных
    #35327112
Vetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Есть новостной сайт. Он содержит новости, пользовательские комментарии к ним и различные досье. В дальнейшем будут и другие объекты.

Необходимо разработать механизм голосований, чтобы можно было бы голосовать и за новости, и за комментарии, и за различные досье.

Как это можно правильно спроектировать? Первое, что идем на ум:
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE TABLE MARKS(
  MARK_ID INT PRIMARY KEY,
  MARK_TYPE TINYINT,
  NEWS_ID INT NULL,
  COMMENT_ID INT NULL,
  DOSSIER_ID INT NULL,
  MARK INT);

Здесь MARK_TYPE - это селектор, который определяет, за что голосовали, NEWS_ID, COMMENT_ID и DOSSIER_ID - это внешние ключи на таблицы новостей, комментариев или досье соответственно, MARK - собственно оценка (от 1 до 5, например).

Таким образом, есть MARK_TYPE равно один, например, то приложения знают, что нужно читать идентификатор внешнего ключа с NEWS_ID и делать соединение с NEWS, если что; если MARK_TYPE равно два, то приложения знают, что нужно читать идентификатор для внешнего ключа с COMMENT_ID и джойниться с COMMENTS, и т.д.

Соответственно, программный компонент "отображение среднего бала" будет иметь настройку, и в соответствие с ней рассчитывать оценку за текущий материал/комментарий/досье.

Правильная ли такая схема данных для моей ситуации? Или можно сделать как-то красивее?

Всем заранее спасибо!
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35328781
Vetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смущает еще то, что если придется оценивать другие объекты БД, например авторов текстов, то нужно будет добавлять еще одну колонку и внешний ключ в таблицу MARKS. Правильно ли это?
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35329365
Фотография BrigadeFuhrer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Елси MARK_TYPE уже есть тогда не нужно разделение на NEWS_ID,COMMENT_ID,DOSSIER_ID, пусть это будет общий ENTITY_ID, все равно будет условие по двум полям MARK_TYPE и ID при соединении с контентной таблицой
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35329373
Фотография BrigadeFuhrer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да и на (MARK_TYPE, ENTITY_ID ) повесить юник индекс
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35329393
Vetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BrigadeFuhrerЕлси MARK_TYPE уже есть тогда не нужно разделение на NEWS_ID,COMMENT_ID,DOSSIER_ID, пусть это будет общий ENTITY_ID, все равно будет условие по двум полям MARK_TYPE и ID при соединении с контентной таблицой
Спасибо!
Это хорошо при условии, что все PK во внешних таблицах имеют один тип данных (в данном случае INT). А как быть, если, например, в каких-нибудь таблицах будет PK числом, в некоторых строкой а в некоторых, например, датой? Делать по полю на каждый тип первичного ключа?
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35329507
Фотография BrigadeFuhrer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vetal BrigadeFuhrerЕлси MARK_TYPE уже есть тогда не нужно разделение на NEWS_ID,COMMENT_ID,DOSSIER_ID, пусть это будет общий ENTITY_ID, все равно будет условие по двум полям MARK_TYPE и ID при соединении с контентной таблицой
Спасибо!
Это хорошо при условии, что все PK во внешних таблицах имеют один тип данных (в данном случае INT). А как быть, если, например, в каких-нибудь таблицах будет PK числом, в некоторых строкой а в некоторых, например, датой? Делать по полю на каждый тип первичного ключа?

а есть такие таблицы? если нет ,то плюнуть на это. сложно представить какой-любо другой тип пк для контент таблиц. не ну можно делать по теории - общая таблица голосов связывается через таблицу пересечения с контент таблицей, итого на каждую сцщность будет джойтится 3 таблицы - голоса, голоса_сущности, сущность.
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35330570
Vetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BrigadeFuhrerне ну можно делать по теории - общая таблица голосов связывается через таблицу пересечения с контент таблицей, итого на каждую сцщность будет джойтится 3 таблицы - голоса, голоса_сущности, сущность.То-есть, связь многие-ко-многим? А зачем она нужна? Ведь один голос может быть предназначен только за один материал/досье/комментарий... Тут само собой напрашивается связь один-ко-многим...

Или я чего не понял?
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35330600
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VetalЗдесь MARK_TYPE - это
.... это лишнее поле, годное только усложнять запросы и провоцировать извраты ....

VetalТаким образом, есть MARK_TYPE равно один, например, то приложения знают, что нужно читать идентификатор внешнего ключа с NEWS_ID и делать соединение с NEWS,
.... типа, например, описанного. В то время как достаточно просто сджойнить по news_id.
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35330852
Vetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer VetalЗдесь MARK_TYPE - это
.... это лишнее поле, годное только усложнять запросы и провоцировать извраты ....

VetalТаким образом, есть MARK_TYPE равно один, например, то приложения знают, что нужно читать идентификатор внешнего ключа с NEWS_ID и делать соединение с NEWS,
.... типа, например, описанного. В то время как достаточно просто сджойнить по news_id.
и тогда понять, к какому типу относится коммент, можно по тому, поле для какого внешнего ключа не null?
А какое тогда решение все же лучше?
1) только что предложенное, когда нет селектора MARK_TYPE, и просто джойнится нужная таблица с оценкой по соответствующему внешнему ключу, и в таблице MARK столько же внешний ключей, сколько и возможных объектов-таблиц, за которые можно проголосовать
2) ранее предложенное, когда есть только одно поле типа Object_Id и селектор MARK_TYPE для того, чтобы знать с какой таблицей джойниться
?
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35330882
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3) несколько однотипных таблиц на каждый ресурс по отдельности
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35330899
474
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vetal1) только что предложенное, когда нет селектора MARK_TYPE, и просто джойнится нужная таблица с оценкой по соответствующему внешнему ключу, и в таблице MARK столько же внешний ключей, сколько и возможных объектов-таблиц, за которые можно проголосовать


А зачем нужен соответствующий ключ?
Просто одно поле с внешним ключом на ID объекта. А ID всех объектов уникальны, за счет выделения непересекающихся множеств значения для однородных объектов.
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35331050
Vetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych3) несколько однотипных таблиц на каждый ресурс по отдельностиИ что, так будет лучше?
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35331058
Vetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
474А зачем нужен соответствующий ключ?
Просто одно поле с внешним ключом на ID объекта. А ID всех объектов уникальны, за счет выделения непересекающихся множеств значения для однородных объектов.И что, так будет лучше? А если появится новая таблица, то что - у всех таблиц менять итервалы ключей?
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35331111
474
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vetal 474А зачем нужен соответствующий ключ?
Просто одно поле с внешним ключом на ID объекта. А ID всех объектов уникальны, за счет выделения непересекающихся множеств значения для однородных объектов.И что, так будет лучше? А если появится новая таблица, то что - у всех таблиц менять итервалы ключей?

Вы теоретизируете или вопрос имеет практическое значение?

Если это практика, то это все решается. Например самое простое решение - сделайте интервалы с запасом. Добавьте в начало ключа разряды на новые таблицы.

100 0000000000000001 – первая запись в первой таблице
200 0000000000000001 - первая запись во второй таблице
NNN 0000000000000001 - первая запись во NNN таблице
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35331180
М.б., что-нибудь такого плана...

Код: plaintext
1.
2.
3.
CREATE TABLE OBJECTTYPE(
  TYPE_ID INT PRIMARY KEY,
  NAME VARCHAR);

Код: plaintext
1.
2.
3.
4.
5.
CREATE TABLE MARKS(
  MARK_ID INT PRIMARY KEY,
  OBJ_ID INT,  
  MARK INT,
  FOREIGN KEY (OBJ_ID) REFERENCES OBJECTSLIST(OBJ_ID));

Код: plaintext
1.
2.
3.
4.
CREATE TABLE OBJECTSLIST(
  OBJ_ID INT PRIMARY KEY,
  TYPE_ID INT ,  
  FOREIGN KEY (TYPE_ID) REFERENCES OBJECTTYPE(TYPE_ID));

Код: plaintext
1.
2.
3.
4.
CREATE TABLE NEWS(
  NEW_ID INT PRIMARY KEY,
  OBJ_ID INT
  FOREIGN KEY (OBJ_ID) REFERENCES OBJECTSLIST(OBJ_ID));

Код: plaintext
1.
2.
3.
4.
CREATE TABLE COMMENTS(
  COMMENT_ID INT PRIMARY KEY,
  OBJ_ID INT
  FOREIGN KEY (OBJ_ID) REFERENCES OBJECTSLIST(OBJ_ID));

Код: plaintext
1.
2.
3.
4.
CREATE TABLE DOSSIERS(
  DOS_ID INT PRIMARY KEY,
  OBJ_ID INT
  FOREIGN KEY (OBJ_ID) REFERENCES OBJECTSLIST(OBJ_ID));

Делаем справочник типов объектов (OBJECTTYPE). И единую таблицу для всех объектов (OBJECTSLIST). Таблицы с объектами конкретных типов на нее ссылаются.
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35331225
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vetalи тогда понять, к какому типу относится коммент, можно по тому, поле для какого внешнего ключа не null?
Фокус в том, что "понимать" это чаще всего не требуется вообще. Чаще всего требуется просто вывести записи по имеющемуся мастеру. А так - да, именно по not null.

Vetal2) ранее предложенное, когда есть только одно поле типа Object_Id и селектор MARK_TYPE для того, чтобы знать с какой таблицей джойниться
Хм. Скажем так, я по цензурным соображениям не хочу говорить того, что думаю об этом варианте, но в целом я считаю его крайне неудачным. Если существующие БД обзаведутся возможностью вменяемо поддерживать foreign key в таких случаях - можно будет говорить о том, что решение в принципе жизнеспособно.
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35331725
Vetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Золотая рыбкаМ.б., что-нибудь такого плана...

Код: plaintext
1.
2.
3.
CREATE TABLE OBJECTTYPE(
  TYPE_ID INT PRIMARY KEY,
  NAME VARCHAR);

Код: plaintext
1.
2.
3.
4.
5.
CREATE TABLE MARKS(
  MARK_ID INT PRIMARY KEY,
  OBJ_ID INT,  
  MARK INT,
  FOREIGN KEY (OBJ_ID) REFERENCES OBJECTSLIST(OBJ_ID));

Код: plaintext
1.
2.
3.
4.
CREATE TABLE OBJECTSLIST(
  OBJ_ID INT PRIMARY KEY,
  TYPE_ID INT ,  
  FOREIGN KEY (TYPE_ID) REFERENCES OBJECTTYPE(TYPE_ID));

Код: plaintext
1.
2.
3.
4.
CREATE TABLE NEWS(
  NEW_ID INT PRIMARY KEY,
  OBJ_ID INT
  FOREIGN KEY (OBJ_ID) REFERENCES OBJECTSLIST(OBJ_ID));

Код: plaintext
1.
2.
3.
4.
CREATE TABLE COMMENTS(
  COMMENT_ID INT PRIMARY KEY,
  OBJ_ID INT
  FOREIGN KEY (OBJ_ID) REFERENCES OBJECTSLIST(OBJ_ID));

Код: plaintext
1.
2.
3.
4.
CREATE TABLE DOSSIERS(
  DOS_ID INT PRIMARY KEY,
  OBJ_ID INT
  FOREIGN KEY (OBJ_ID) REFERENCES OBJECTSLIST(OBJ_ID));

Делаем справочник типов объектов (OBJECTTYPE). И единую таблицу для всех объектов (OBJECTSLIST). Таблицы с объектами конкретных типов на нее ссылаются.А чем это решение принципиально отличается от того, что я вначале предложил? В чем преимущество именно этого подхода? Мне кажется, так только усложняется схема данных и работа с ними... Или я все же ошибаюсь?
...
Рейтинг: 0 / 0
Помогите правильно спроектировать изменения в схеме данных
    #35331906
Код: plaintext
А чем это решение принципиально отличается от того, что я вначале предложил?
Отличается тем, что мы вводим некий абстрактный объект (OBJECTSLIST). Независимо от того, сколько типов объектов у вас будет на самом деле (NEWS, COMMENTS, DOSSIERS и так далее) в таблице MARKS будет только одно поле, ссылающееся на OBJECTSLIST. В таблицы конкретных типов (NEWS, COMMENTS....) добавляется внешний ключ на OBJECTSLIST - так реализуем наследование.
Таким образом для добавления нового типа объекта достаточно создать новую таблицу (скажем, AUTHORS - также с FK на OBJECTSLIST) и добавить соответствующую запись в справочник типов. Новые колонки в таблицу MARKS не добавляются.
При этом сохранится контроль за ссылочной целостностью, что, к сожалению, невозможно, если использовать вариант
Код: plaintext
'одно поле типа Object_Id и селектор MARK_TYPE '
.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Помогите правильно спроектировать изменения в схеме данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]