2012-12-19 25 views
6

我正在構建一個PHP/MySQL應用程序,我允許用戶創建自己的自定義(儘可能多)他們的個人資料數據(即他們可以添加任何數量的信息到他們的配置文件,但有一個「核心」用戶配置文件字段)MySQL,但不知道列名前手

例如,他們可以在窗體上創建一個新的文本框,並將其稱爲「我的寵物」和/或「我最喜歡的顏色」。我們需要將這些數據存儲在數據庫中,並且顯然不能爲每個選擇創建列,因爲我們不知道他們的附加信息是什麼。我們認爲我們可以存儲所有「addidional信息」,他們提供

一種方式是存儲他們的其他信息作爲JSON並將其存儲在一個MySQL文本字段(我愛MySQL的:))

我見過Wordpress表單構建器插件,您可以創建自己的字段,所以我認爲他們必須以某種方式將數據存儲在MySQL中,因爲NoSQL解決方案超出了這些插件的範圍。

我很想堅持MySQL,但是你們認爲像MongoDB/Redis這樣的NoSQL解決方案會是更好的解決方案嗎?

謝謝

+0

答案與往常一樣,是_it depends_。如果你有成千上萬的用戶,你需要嘗試各種解決方案,看看會發生什麼。但是,對於相對較小的一組行的一小組選項,在現有的關係數據庫中,JSON或序列化的PHP值是沒有問題的。我認爲WordPress的內部使用序列化的一些選項記錄。 – halfer

+0

+1有趣的問題和一個不錯的功能:-) –

回答

1

您可以創建一個鍵值對的表,其中任何不在覈心的東西都將被存儲。該表看起來像:user_id,name_of_user_specified_field,user_specified_value;

任何name_of_user_specified_field開始顯示很多,然後可以添加到核心表。這被稱爲實體屬性值。請注意,有些人認爲這是一種反模式。

如果你這樣做,請加控制,以限制用戶可以創建新條目的數量或者你可能發現有人餡你的數據庫有很多領域:)的

+0

謝謝雷從來沒有想到這一點,但它可能?如果很多用戶擁有大量的自定義字段,會變得非常龐大?你怎麼看? –

+1

@BillJobs是的,這就是爲什麼你需要施加一些限制,就像用戶最多隻能創建10個自定義字段一樣。 – Ray

+0

非常非常真實,限制對於「自定義數據」是有意義的 –

3

一種方式來處理,這是使用使用EAV範例的單個表或實體屬性值。請參閱Wikipedia article。在許多方面,這要比讓用戶選擇數據庫模式更爲整齊。

+0

看起來非常有趣,介紹似乎解決了我的問題......這是原生的MySQL還是設計範例? –

+1

這對任何關係數據庫來說都是天作之合。我猜想它也可以用於電子表格。 – wallyk

0

MySQL可以處理這個很好。如果額外的數據總是一起被抽出(即你不需要獲得只有寵物字段沒有任何其他字段),那麼你可以將它存儲在users表的一列中。但是,如果您需要更多關係模型,則可以將額外數據存儲在由用戶標識鏈接的單獨表中。額外的表格將有一個用於用戶ID的列,附加字段名稱附加字段值以及您可能需要的任何其他字段值。然後,只需運行JOIN查詢即可獲取配置文件以獲取所有額外字段。

+0

感謝您的回覆G-Nugget,是我唯一的選擇,當我不知道列名前手? –

+0

@BillJobs不,您可以使用新的字段名稱和值將新行插入附加信息表中。 –