Нормализация БД и таблицы поиска - PullRequest
0 голосов
/ 27 июня 2011

Думая о БД, у вас есть базовая таблица, например, таблица ссылок. Ссылки могут иметь внешний ключ, указывающий на объект / запись аккаунта. Однако, ради простоты и абстракции (например, рассматривая ссылку как контент-ресурс), я подумал, что назначу ссылку на учетную запись через общую справочную таблицу (например, называемую lookups, а не * 1002). * или link_accounts).

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

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

Буду признателен за некоторые мысли, если у кого-нибудь есть их:)

схема:

ссылки:

CREATE TABLE `links` (
  `link_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `timestamp_updated` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
  `timestamp_created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `status` varchar(16) COLLATE utf8_unicode_ci NOT NULL,
  `type` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `title` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  `description` longtext COLLATE utf8_unicode_ci NOT NULL,
  `resource` longtext COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`link_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Links';

поиски:

CREATE TABLE `lookups` (
  `lookup_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `timestamp_updated` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
  `timestamp_created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `status` varchar(16) COLLATE utf8_unicode_ci NOT NULL,
  `type` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `source_node_type` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  `source_node_id` int(10) unsigned NOT NULL,
  `target_node_type` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  `target_node_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`lookup_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Obejct Assignments';

1 Ответ

1 голос
/ 27 июня 2011

Таким образом, вы хотите хранить ссылки без добавления внешнего ключа, который заставил бы вас связать его с учетной записью -ИЛИ- пользователем, поскольку FK будет указывать на одну конкретную таблицу?

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

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

...