如果只有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';
這意味着當你在用戶插入或更新行,還需要插入或更新您的每一個輔助表,與您的數據保持同步。隨着您添加更多輔助表格,這可能會變成一件複雜的事情。