Одна таблица против нескольких таблиц? - PullRequest
0 голосов
/ 02 июня 2018

Моя таблица сообщений содержит столбцы: id, user_id, title, message, date

Моя таблица комментариев содержит столбцы: id, user_id, post_id, message, date

Начиная с этих 2таблицы очень похожи, было бы лучше иметь одну таблицу со столбцами:

id, user_id, parent_id, тип, заголовок, сообщение, дата

и каждая строка, являющаяся родительскойсообщение будет иметь пустое значение parent_id, а каждая строка, являющаяся дочерним сообщением, будет иметь пустое значение заголовка.Тип будет либо 1 для родительских постов, либо 2 для дочерних постов.

Редактировать: я также буду использовать функцию оценки и снова задаю тот же вопрос, 2 конкретные таблицы post_rating и comment_rating, или общие таблицы рейтинга,В случае таблицы рейтингов, структура будет точно такой же, поэтому поля, не обнуляемые.Также маловероятно, что таблица (-и) рейтинга изменится, поскольку она знает только о владельце рейтинга, фактическом рейтинге и целевой публикации / комментарии / и т. Д.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Я бы не стал этого делать по нескольким причинам:

  1. Между этими двумя типами есть дочернее / родительское отношение, и для таких отношений у вас есть внешние ключи и отдельные таблицы.
  2. Никогда не используйте одну и ту же таблицу только потому, что имя столбца одинаковое.Не пытайтесь сэкономить место здесь, пространство не стоит ничего, но ваше время, чтобы понять это позже или изменить это.Необходимость объяснить ваш дизайн БД (что вы должны были сделать) является результатом неясного дизайна.Так что держите его в чистоте и не пытайтесь быть умным, чтобы сохранить некоторые биты или не создавать новую таблицу;)
  3. Изменение этой таблицы всегда затрагивает оба элемента, а не только один.Если вы хотите добавить ссылку с миниатюрным изображением к комментарию, вы также должны прикоснуться к сообщениям.Это приводит к дополнительному тестированию, что все еще работает.
  4. Наличие нулевых значений в вашей таблице - это нормально, но не идеально.Это, конечно, раздражает, когда вы пытаетесь использовать эту таблицу в среде программирования, где вам нужно проверить наличие нулей
  5. Вы можете поместить их в одну таблицу, если они наследуются от одного и того же типа.Например, у вас может быть элемент «Текст» и, скажем, комментарий, а сообщение - это текст.Но опять же, отношение из пункта 1 остается в силе, и это снова приведет к уродливому дизайну.

Восстановление системы оценок. Вы можете просто составить обычную таблицу с оценками, и таблица комментариев и сообщений получит отношение FK к таблице оценок.Как тот, который у вас есть для пользователя прямо сейчас.Тем не менее, вы также можете создать две отдельные таблицы, чтобы быть более гибкими позже, и это может сделать объединения немного быстрее, так как рейтинговые таблицы не будут такими большими.Но это более личное предпочтение, чем все остальное.Я бы, конечно, составил бы отдельную таблицу, если рейтинговые системы будут отличаться друг от друга, но в этом случае я бы тоже выбрал одну.

0 голосов
/ 02 июня 2018

Использование одной таблицы позволит вам иметь более глубокую вложенную иерархию.Например:

title
    comment
    comment2
        comment_to_comment
    comment3
        comment_to_comment2
        comment_to_comment3

Так что это дополнительная возможность, которая не существует при настройке таблицы 2.

«Я бы сделал это, только если вам нужна эта возможность», потому что запросы будутбыть более сложным.Также было бы полезно добавить столбец (root_id) в такую ​​таблицу, чтобы указать узел с заголовком для комментариев с уровнем вложенности больше 1.

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

create table element (     
    id        serial  not null primary key,
    data      integer not null
);

create table heirarchy (
    id        serial  not null primary key,
    id_root   integer not null references element(id),
    id_parent integer not null references element(id),
    id_child  integer not null references element(id)
);

insert into element (data) values (100);
insert into element (data) values (101);
insert into element (data) values (102);
insert into element (data) values (103);
insert into element (data) values (104);
insert into element (data) values (105);
insert into element (data) values (106);
insert into element (data) values (107);
insert into element (data) values (108);

select id, data from element;

1 |100
2 |101
3 |102
4 |103
5 |104
6 |105
7 |106
8 |107
9 |108

insert into heirarchy (id_root, id_parent, id_child) values (3, 3, 4);
insert into heirarchy (id_root, id_parent, id_child) values (3, 3, 5);
insert into heirarchy (id_root, id_parent, id_child) values (3, 4, 1);
insert into heirarchy (id_root, id_parent, id_child) values (3, 4, 2);
insert into heirarchy (id_root, id_parent, id_child) values (3, 1, 9);
insert into heirarchy (id_root, id_parent, id_child) values (6, 6, 7);
insert into heirarchy (id_root, id_parent, id_child) values (6, 6, 8);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...