0

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

尽管链接可以只有永远被分配给一个帐户(并且必须始终分配给一个帐户),但内在我想要创建该外键。但我真的很喜欢抽象出一个对象/数据资源并将它的上下文分离的概念(例如它被分配给一个帐户,或者一个用户,或者其他任何东西)。

希望得到一些想法如果任何人有EM :)

模式:

链接:

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

或至少有一些模式可以使用。用模式更新了 – jpm

+0

。 – onassar

回答

1

所以,你要存储的联系,而不添加一个外键的原因,这将迫使你链接它说一个帐户 - 或 - 我们呃因为FK会指向一个特定的表?

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

在查找表中添加多个可空的FK也是可能的,也许不太一般。添加一个约束,以确保至少有一个和最多一个FK被设置为一个值。