0

做一些数据库思考,并有一个基本表,例如链接表。链接可以有一个指向帐户对象/记录的外键。但是,为了简单和抽象(例如,将链接视为基于内容的资源),我想我会通过通用查找表(例如,称为lookups,不account_linkslink_accounts)将链接分配给帐户。

虽然链接只能分配给一个帐户(并且必须始终分配给一个帐户),但内在的我想要创建那个外键。

但我真的很喜欢抽象出一个对象/数据资源并解耦它的上下文的概念(例如,它被分配给一个帐户,或一个用户,或其他什么)。

如果有人得到他们,将不胜感激:)

模式:

链接:

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';
4

1 回答 1

1

因此,您想存储链接而不添加外键,因为外键会迫使您将其链接为帐户 - 或 - 用户,因为 FK 将指向一个特定的表?

您可以将链接值单独存储在它自己的“查找”表中作为 PK 或具有唯一索引。然后从您的用户、帐户和其他内容中获取 FK。但是,这将引入共享,您必须添加一些约束以确保如果链接已经在“查找”表中,则无法分配链接。

在查找表上添加多个可为空的 FK 也是可能的,但可能不太通用。添加一个约束以确保至少一个且最多一个 FK 被设置为一个值。

于 2011-06-27T02:03:15.023 回答