数据库规范化和查找表

时间:2011-06-27 01:40:51

标签: database database-design normalization database-normalization

做一些数据库思考,并有一个基本表,例如,一个链接表。 链接可以具有指向帐户对象/记录的外键。但是,为了简单和抽象(例如将链接视为基于内容的资源),我想我会通过一般查找表(例如,称为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';

1 个答案:

答案 0 :(得分:1)

所以你想要存储链接而不添加外键会导致你把它链接起来说一个帐户-OR-一个用户,因为FK会指向一个特定的表?

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

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