2011-06-20 21 views
0

我有一個數據庫,它存儲了一些用戶。每個用戶都有其帳戶設置,隱私設置和許多其他屬性設置。這些房產的數量開始增長,我最終可能會購買30個物業。直到現在,我還是把它保存在「UserInfo」表中,該表具有與One-To-Many相關的User和UserInfo(記錄所有更改)。將它放在單個「UserInfo」表中聽起來不太好,至少在數據庫模型中,它看起來很亂。什麼是解決方案?組織數據庫表 - 大量的屬性

將隱私設置,帳戶設置和設置的其他「組」設置分隔開並在UserInfo和每組設置表之間具有1-1關係是一種解決方案,但是當這種解決方案太慢(或慢得多)時檢索數據?我想所有的數據都不會在同一時間在單個頁面上顯示。因此,也許每個表具有一對多的關係也是一個解決方案(保持每個組的日誌分開)?

回答

1

如果只有30個屬性,我建議只創建30列。對於現代數據庫來說,這並不算太多。

但是我猜如果你今天有30個房產,隨着時間的推移,你會繼續發明新的房產,並且列數將會持續增長。每天重組您的表以添加列可能會因爲您獲得大量行而變得非常耗時。

如需其他解決方案,請查看此博客,以獲取以「無模式」方式存儲大量動態屬性的漂亮解決方案:How FriendFeed Uses MySQL

基本上,將所有屬性收集到某種格式並將其存儲在單個TEXT列中。該格式是半結構化的,也就是說,如果需要,您的應用程序可以分離屬性,但是您也可以隨時添加更多內容,甚至可以在每行中添加不同的屬性。 XML或YAML或JSON是示例格式,或者是您的應用程序代碼語言支持的一些對象序列化格式。

CREATE TABLE Users (
    user_id SERIAL PRIMARY KEY, 
    user_proerties TEXT 
); 

這使得很難搜索給定屬性中的給定值。因此,除了TEXT列之外,還要爲每個要搜索的屬性創建一個輔助表格,其中包含兩列:給定屬性的值和返回主表的特定值的外鍵。現在您可以對列進行索引,以便快速查找。

CREATE TABLE UserBirthdate (
    user_id BIGINT UNSIGNED PRIMARY KEY, 
    birthdate DATE NOT NULL, 
    FOREIGN KEY (user_id) REFERENCES Users(user_id), 
    KEY (birthdate) 
); 

SELECT u.* FROM Users AS u INNER JOIN UserBirthdate b USING (user_id) 
WHERE b.birthdate = '2001-01-01'; 

這意味着當你在用戶插入或更新行,還需要插入或更新您的每一個輔助表,與您的數據保持同步。隨着您添加更多輔助表格,這可能會變成一件複雜的事情。