Таблицы SQL со схожей структурой - лучшие практики - PullRequest
1 голос
/ 26 октября 2011

Представьте, что у нас есть веб-сайт, на котором пользователи могут читать статьи, просматривать фотографии, смотреть видео и многое другое. Каждый «элемент» может быть прокомментирован, так что нам нужно место для сохранения этих комментариев где-то Давайте обсудим возможности хранения для этого случая.


Распределенное решение

Очевидно, что мы можем создавать отдельные таблицы для каждого «элемента», поэтому у нас есть такие таблицы:

CREATE TABLE IF NOT EXISTS `article_comments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `createdBy` int(11) DEFAULT NULL,
  `createdAt` int(11) DEFAULT NULL,
  `article` int(11) DEFAULT NULL,
  `content` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

, а затем, очевидно, photo_comments, video_comments и так далее. Преимущества этого способа заключаются в следующем:

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

Недостатки:

  • много таблиц
  • вероятно, трудно поддерживать (добавление полей и т. Д.)

Централизованное решение

С другой стороны, мы можем объединить все эти таблицы в две:

CREATE TABLE IF NOT EXISTS `comment_types` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

и

CREATE TABLE IF NOT EXISTS `comments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `createdBy` int(11) DEFAULT NULL,
  `createdAt` int(11) DEFAULT NULL,
  `type` int(11) DEFAULT NULL,
  `content` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Таблица comment_types - это словарь, он содержит пары ключ-значение прокомментированного элемента «тип» и его имя, например:

1:Articles
2:Photos
3:Videos

В таблице comments хранятся обычные данные с дополнительным полем type.

Преимущества:

  • Обслуживание (добавление / удаление полей),
  • Добавление новых типов комментариев "на лету".

Недостатки:

  • Труднее мигрировать / экспортировать,
  • Возможное падение производительности при запросе большого набора данных.

Обсуждение:

  • Какой вариант хранения будет лучше с точки зрения производительности запросов (предположим, что набор данных достаточно большой для этого),
  • Опять производительность - добавит ли INDEX на type удаление или радикально уменьшит это падение производительности?
  • Какой вариант хранения будет лучше с точки зрения управления и возможной миграции в будущем (распределенное будет лучше, конечно, но давайте посмотрим, далеко ли не централизованный)

1 Ответ

1 голос
/ 26 октября 2011

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

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

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