我一直在想這個晚上(格林威治標準時間),但我似乎無法找出這個好的解決方案。這裏的情況...註冊有和沒有地址的MySQL數據庫模型
我要創建一個註冊系統,用以區別4種「用戶」的:
- 個人申請(需要地址信息)
- 集團的註冊量(不需要地址信息)
- 集團聯繫(需要地址信息)
- 應用的用戶(不需要地址信息)
我真的不能想出一個體面的方式來建模這個有意義的東西。如果您能分享您的想法,我將不勝感激。
在此先感謝!
我一直在想這個晚上(格林威治標準時間),但我似乎無法找出這個好的解決方案。這裏的情況...註冊有和沒有地址的MySQL數據庫模型
我要創建一個註冊系統,用以區別4種「用戶」的:
我真的不能想出一個體面的方式來建模這個有意義的東西。如果您能分享您的想法,我將不勝感激。
在此先感謝!
我決定去建設小組成員與用戶池分開。小組成員最終與用戶沒有任何關係,因爲他們不需要改變他們的個人數據,這就是小組聯繫人的用途。最終,我可以爲團隊添加多個聯繫人的可能性,甚至可以區分被允許或不允許編輯任何成員數據的人員。
這就是我對這個問題的回答。
聽起來像是不錯的情況下,單表繼承
需要一定的數據多於你的數據庫應用程序邏輯的功能。您可以明確定義不允許NULL值的數據庫列,但可以將它們設置爲「」(空字符串)而不會出現任何錯誤。
至於如何構建數據庫,有兩個獨立的表:
當你有需要的聯繫信息一個新的申請,您的應用程序將創建記錄在兩個表中。當新註冊不需要地址信息時,您的應用程序將只在用戶表中創建一條記錄。
這裏有幾點需要注意:首先,我喜歡將User/Group看作Composite模式的一個例子。它明顯符合要求:您經常必須互換地處理實體的聚合和個別版本(如您注意的那樣)。在數據庫中實現組合並不難。如果你使用的是ORM,它非常簡單(繼承)。
在問題的另一部分,您總是可以創建大多數爲空的數據結構。一般來說,這是一個壞主意。所以你可以說'好吧,一開始我們沒有關於用戶的任何信息,所以我們只會將所有其他字段留空。「更好的方法是嘗試和模擬階段,就好像它們是FSM的一部分一樣。在這種特殊情況下最明顯的做法之一是區分用戶,賬戶和其他一些更具領域特徵的實體,訂戶或客戶。然後,我可以前來瀏覽並使用用戶,註冊並創建帳戶,然後當您想要地址和其他個人信息時,成爲訂閱者。這也意味着繼承,而且你還有一個額外的好處,就是在任何時候都能夠真實地表示人口,而不需要像'SELECT COUNT(*)Where'_ not null'等等的笨蛋。
我認爲我在這裏的關鍵字是繼承(也提到@Kelend)。我想也考慮到我爲應用程序考慮的技術設計,這實際上是最有意義的。你可以給我一個例子來說明如何在FSM的角度來模擬數據庫實體嗎? – 2011-06-09 00:50:38
在我給出的例子中,我說的是狀態機正在將人從偶然的潛伏者(用戶)轉變爲註冊(擁有一個賬戶)成爲活躍成員(成員,訂閱者,客戶等等)。這就是狀態機:人通過各種狀態前進,而不是隨着時間的推移隨意填充大量稀疏數據。 – Rob 2011-06-09 01:02:30
在我的情況下,我不認爲FSM會起作用,因爲只要有條目,條目就是不同類型的用戶之一。他們不會隨着時間而改變。 – 2011-06-09 01:08:25
這是我在稱讚這個模型的pro和con之後從我的最後一個建議。我認爲理想的設置是讓所有用戶成爲屬於某個組的用戶實體,而不區分個人組(除了標記組聯繫人並創建與組表的鏈接外),我們提出了替代方案組創建時將組聯繫人用戶詳細信息複製到組成員。
這樣所有實體都是一個人會得到自己的表。
這是個好主意嗎?等待你的意見:)
儘可能不允許NULL的背後的想法是防止在磁盤上的數據庫文件中形成空隙,使文件不必要的大。這是一種誤解嗎? – 2011-06-09 00:41:06
我以前沒有聽說過這個,但如果你能提供一個參考,我會很高興閱讀它。 – 2011-06-09 00:42:21
我會放棄這個想法,因爲我擁有的所有證據都是在某處閱讀它的虛構記憶。 – 2011-06-09 00:52:41