簡體   English   中英

如何存儲多值配置文件詳細信息?

[英]How to store multi-valued profile details?

我有很多字段是多值的,不確定如何存儲它們? 如果我做3NF,那么有很多表。 例如:國籍。

一個人可以具有單一或雙重國籍。 如果是對偶,則表示一對多。 所以我創建了一個用戶表和一個user_nationality表。 (已經有一個國籍查詢表)。 或者我可以將兩個國籍放在同一行中,例如“ American,German”,然后在運行時將其反序列化。 但是然后我不知道我是否可以搜索? 例如,如果我只搜索德國人,它將顯示嗎?

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

您還必須記住,一些多值字段組合在一起,例如“我就讀的大學”,它具有一組字段,例如大學名稱,學位類型,時間線等。用戶可以擁有一個到多個這些。 因此,我假設我可以使用這些字段為user_education創建一個單獨的表,但假設這些字段之一也是固定值的多值列表(例如我訪問過的大學校園),那么我們將最終得到一個永無止境的FK表鏈對於社交網絡而言,這並不是一個很好的設計,因為目標是將盡可能多的數據放入盡可能少的表中以提高性能。

簡單的解決方案是停止使用SQL表。 這就是NoSQL的目的。 簽出CouchDB或Mongo。 在那里,每個值都可以存儲為完整的結構-因此,可以將整個問題簡化為一個(不是真正的)表。

幾乎任何基於SQL的解決方案的弊端都是速度很慢。 獲取單個用戶時速度很慢-搜索時(如果您決定將這些值存儲為序列化)大型海量JOIN語句將不會快速執行或執行速度會很慢。

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

就國籍而言,如果您僅需要兩個國籍(最壞的情況),則可以考慮使用第二個國籍字段(Nationality和Nationality2)來解決這個問題。 當然,這僅適用於具有少量最大不同值的字段。

如果您的用戶表具有很多相關屬性,那么一種可能性是創建一個具有(user_id,attribute_name,attribute_value)之類的行的屬性表。 您可以將所有屬性存儲到一個表中。 您可以使用此表來獲取給定用戶的屬性,也可以按屬性名稱和值進行搜索。

您可能還需要查看ORM,它將自動將您的對象映射到數據庫。
http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software#PHP

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

沒錯,表的最大數目是61,但實際上,以表為例,它可能會更少:

“我就讀的大學”

“我訪問過的大學校園”

在這種情況下,您可能只有一個“拼貼”表,因此在此布局中將有四個表,而不是五個。

我要說的是,如果要建模的數據集很大,請不要擔心使用大量表-只需確保您保持最新的ERD,以免迷路! 另外,不要太在意“鏈接表”范式-“鏈接表”本身就是“實體”,例如,您可以將“我就讀過的大學”鏈接表視為而是使用“拼貼畫注冊”表,為其提供自己的主鍵,並將每次支付課程費用的時間存儲為(鏈接的)“拼貼畫注冊付款”表中的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM