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被設置爲一個值。