2010-12-04 98 views
0

我有很多領域是多值的,不知道如何存儲它們?如果我做3NF,那麼有很多表。例如:國籍。如何存儲多值個人資料詳細信息?

一個人可以有單身或雙重國籍。如果雙重這意味着它是一對多的。所以我創建了一個用戶表和一個user_national表。 (已經有國籍查詢表)。或者我可以將兩個國家放入「美國人,德國人」相同的行,然後在運行時將其反序列化。但後來我不知道我是否可以搜索這個?如果我只搜索德國人,它會出現嗎?

這是一個例子,我有30多個字段是多值的,所以我假設我不會爲此創建61個表格? 1個用戶表,30個查找表來保存每個多值項目的查找,30個表格保存多值項目的user_值?

你還必須記住,一些多值字段組合在一起,比如「我學過的大學」,它有一組字段,如大學名稱,學位類型,時間線等。用戶可以有1對許多這些。所以我假設我可以爲這個像user_education這些字段創建一個單獨的表,但讓我們假設這些字段之一也是固定列表多值像我訪問過的大學校園,那麼我們將最終在一個永無止境的FK錶鏈中對於社交網絡來說不是一個好的設計,因爲它的目標是將盡可能多的數據放入儘可能少的表中以提高性能。

回答

0

簡單的解決方案是停止使用SQL表。這是NoSQL所支持的。看看CouchDB或Mongo。每個值都可以存儲爲一個完整的結構 - 所以這個問題可以被簡化爲一個(不是真的)表。

幾乎任何基於SQL的解決方案的缺點是它會很慢。在獲取單個用戶時緩慢 - 在搜索時(如果您決定將這些值存儲爲序列化的),大量的JOIN語句不會執行得很快或很慢。

+0

好NoSQL的解決方案是一個新的領域,要學習他們的語法,所以等錯誤和延時的機會上去。在路上是的,這是計劃,但現在我想快速啓動。 – Brian04 2010-12-04 23:20:30

0

如果您需要繼續使用SQL,您需要創建這些表。你需要決定你願意走多遠,並對系統施加限制(例如只能指定一個校園)。

就國籍而言,如果您只需要兩個國籍(最壞的情況),您可以考慮第二國籍字段(國籍和國籍2)來解釋這一點。當然,這隻適用於具有不同值的最大數量小的字段。

0

如果您的用戶表有很多相關的屬性,那麼有一種可能性是創建一個屬性表,其中包含像(user_id,attribute_name,attribute_value)這樣的行。您可以將所有屬性存儲到一個表中。您可以使用此表爲特定用戶提取屬性,也可以按屬性名稱和值進行搜索。

+0

我需要對此進行建模,看看它是否有效。 – Brian04 2010-12-04 23:21:53

0

這是一個例子,我有超過30 字段其多值的,所以我 假設我不會創建此61個 表?

你是正確的,61是表的最大數量,但在現實中,它很可能會少一些,拿自己的例子:

「大學我學的」

「大學校園裏,我訪問了」

在這種情況下,你可能只有一個「拼貼」的表,所以就在此佈局四個表,而不是五年。

我說不要害怕使用大量的表格,如果數據集你造型是大的 - 只要確保你保持一個最新的ERD,這樣你就不會迷路!另外,不要被逮住了太多的「鏈接表」範式 - 「鏈接表」可以在自己的權利「實體」,例如,你可以認爲鏈接表作爲了「我在研究了高校」的「拼貼入學率」,而不是表,給它自己的主鍵,存儲每個時代的你付出你的課程費用爲在(鏈接)「拼貼報名費」錶行。

+0

通過鏈接表,你的意思是查找表? – Brian04 2010-12-04 23:23:24

相關問題