2009-07-12 33 views
0

我有一個MySQL數據庫,並且該數據庫中的特定表將需要以一對多方式自引用。對於可伸縮性,我需要找到最有效的解決方案。這兩種方式最明顯我是:可擴展的一對多表(MySQL)

1)文本字段添加到表,存儲主鍵有

2)的序列化列表保持一個連接表,每一行是一個單一對一。在案例#1中,我發現表格變得非常寬(使用空間類比),但在案例#2中,我發現鏈接器表增長到很大數量的行,這會減慢查找速度(迄今爲止最常見的操作)。

什麼是最有效的方式,在其中實現在MySQL這樣的一個一對多的關係?或者,也許還有一種更爲明智的解決方案,即將數據全部直接保存在文件系統上,或者其他一些存儲引擎?

+0

查找將是最常見的操作。關係的更新將比新條目更頻繁。 – 2009-07-12 18:16:24

回答

1

只要保持一個表中的「多」,與主表的鍵列。

我quarantee你有很多其他更重要的問題,你在一個標準的工業強度的關係數據庫管理系統運行效率成或容量限制之前解決。

恕我直言,最有可能的第二個選項(與衆多的替代產品)是使用ISAM。

+0

根據您的編輯進行評論:更新應該沒有問題,因爲您將更新值而不是鍵(所以不會涉及索引)。如果記錄很小並且鍵很好地分散,插入不應該太多,通常自己照顧自己。 – dkretz 2009-07-13 00:53:13

+0

想到解釋問題的好方法。把它想象成社交網絡上的「朋友列表」。每個帳戶都可以有許多帳戶列爲「好友」(採用帳戶ID形式)。將存儲遷移到第三個表只是將相同的問題遷移到另一個表 - 在一種情況下,它變得非常寬泛,而在另一種情況下變得非常長。 除非MySQL使用這兩種方法之一處理大量數據實際上效率更高。 – 2009-07-14 20:48:20

0

我的第一個意見是,你會得到更好的反應,如果你能描述數據如何被使用(添加/更新VS查找的頻率,增加VS更新等),除了你已經描述過。話雖這麼說,我首先想到的是隻用


CREATE TABLE IF NOT EXISTS one_table (
    `one_id` INT UNSIGNED NOT NULL AUTO_INCREMENT 
      COMMENT 'The The ID of the items in the one table' , 
    ... other data 
) 

CREATE TABLE IF NOT EXISTS many_table (
    `many_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT 
      COMMENT 'the id of the items in the many table', 
    `one_id` INT UNSIGNED NOT NULL 
      COMMENT 'The ID of the item in the one table that this many item belongs to' , 
    ... other data 
) 

確保,當然通用表示去,上創建兩個表中的one_id的指標。

0

與其說是一個答案,但幾個問題,一個可能的方法....

如果你想使表自參照,並且只使用一個字段...有一些選擇。計算出的可屏蔽'連接'字段描述了將許多行相互關聯的方法。

最好的解決方案可能會考慮數據和關係的性質? 數據和查找的性質是什麼?你試圖包含什麼樣的關係?協會?有關?家長/孩子?