在PHP的幫助下,將多個值存儲在同一個SQL列中的正確方法是什麼?如何使用PHP在同一個SQL列中存儲多個記錄?
例如,在存儲聯繫人/客戶端詳細信息的系統中,允許您添加多於1個電話號碼。例如,您可以爲同一客戶端保存2個手機號碼,1個辦公號碼和其他號碼。
但我不太瞭解如何將這些數據保存在單個列中,而不是爲Home#,Mobile#,Work#等創建一個列。
在我的理解中可能會保存爲JSON格式,但我可能是錯的。
謝謝。
在PHP的幫助下,將多個值存儲在同一個SQL列中的正確方法是什麼?如何使用PHP在同一個SQL列中存儲多個記錄?
例如,在存儲聯繫人/客戶端詳細信息的系統中,允許您添加多於1個電話號碼。例如,您可以爲同一客戶端保存2個手機號碼,1個辦公號碼和其他號碼。
但我不太瞭解如何將這些數據保存在單個列中,而不是爲Home#,Mobile#,Work#等創建一個列。
在我的理解中可能會保存爲JSON格式,但我可能是錯的。
謝謝。
如果您想存儲給定聯繫人的多個電話號碼,您應該通過多個記錄這樣做,而不是給定記錄中的多個值。例如,你可以有一個Numbers
表看起來像這樣:
id | contact_id | number | type
1 | 1 | 591-8563 | 1
2 | 1 | 123-4567 | 2
3 | 2 | 867-5309 | 1
這裏,type
列可以記錄手機是否是如座機(1)或蜂窩(2)。你可以看到聯繫人1
有固定電話號碼和手機號碼,而2
只有固定電話號碼。這個Numbers
表可以被加入聯繫人的表中。
這是我也想到的,創建一個單獨的表並存儲電話號碼從聯繫人表中綁定聯繫人ID。我目前的SQL在聯繫人表中存儲固定電話,移動電話和傳真號碼,以及固定電話和移動電話的擴展選項,說實話,我認爲這足夠了,但我不確定。 – 0111010001110000
在MySQL中這是不可能的 - 除非你想將JSON存儲在一個列中,比如contact_information,然後存儲你在那裏描述的所有數據,所以你不必擔心每次輸入數據結構新的數據集。
查看NoSQL數據庫工具,例如MongoDB,您可以在其中保存JSON,然後通過列名稱調用它,這意味着您不必創建嚴格的列並可根據需要插入更短/更長的條目 - 它比SQL數據庫更靈活。
我看到了,所以它不是新的數據庫平臺,就是處理JSON,這會帶來一些限制,特別是如果試圖用PHP運行搜索查詢。我想我會堅持使用聯繫表中的固定電話+移動列,因爲我還計劃將AES加密添加到MySQL數據,這將使其成爲使用JSON工作時的真正噩夢。我的問題的原因是因爲我在MySQL中看到一些論壇軟件和crm軟件將數據存儲爲{1:something,2:something,3:something}。 – 0111010001110000
是的,它通常保存爲JSON。
$array_to_storage = ["phone1" => 911, "phone2" => 112];
$sql = 'INSERT INTO table (data_column) VALUES ("' . json_encode($array_to_storage) . '")';
但請注意,您不能像WHERE phone2 = 112
那樣進行過濾查詢。但是這樣可以有效地存儲一些不需要此功能的數據。
從技術上講,你不能以正常的方式查詢它,但你可以預先加載所有的電話號碼到用戶端作爲JSON和JS過濾器的真相所需的結果,但如果你有很多客戶端和JSON,這將成爲一個麻煩數據集會很大。 – 0111010001110000
@ 0111010001110000在當前項目中我使用該方法來保存對象狀態數據和查詢使用對象ID。某些對象狀態保存在單獨的列中以在查詢中對其進行過濾。 –
但是如果SQL數據是AES-256加密的呢?這是我關心的問題,因爲這意味着在JSON中,您需要解密大塊數據,而不是解密您只需查找的數據。另外,我不知道JSON如何處理加密數據,以及是否存在數據損壞的可能性,因爲正如您所知,您無法完全修復已損壞的加密數據。 – 0111010001110000
好,比如你有電話號碼的動態數字(如多個手機號碼),您可以改爲創建一個表只是電話號碼和一個關係添加到客戶端:
+-----------------------------------+
| phone_number |
+-----------+-----------+-----------+
| client_id | type | number |
+-----------+-----------+-----------+
| 5 | office #1 | 055768765 |
+-----------+-----------+-----------+
| 5 | mobile | 017884778 |
+-----------+-----------+-----------+
...
但是,如果你真的想把所有的數字保存在客戶端的一列中,這裏是你如何做到這一點:
# Write:
$phone_numbers = array('office #1' => '055768765', 'mobile' => '017884778');
$phone_numbers_for_db = json_encode($phone_numbers);
# Read:
$phone_numbers = json_decode($phone_numbers_from_db);
方法#1似乎更加有用,因爲我可以輕鬆地執行搜索查詢,並且只需要拉取所需的數據對象,而不是拉扯所有數據對象,而我只是在尋找「傳真#」。在我的情況下,JSON的問題是由於我打算保留聯繫人信息加密,因此我不相信它會與JSON-P很好地配合。 – 0111010001110000
我認爲你是對的,它會增加一層不必要的複雜性。無論如何,方法#1是最乾淨的。 –
**不要這樣做**。始終保持值不同。請參閱[規範化](https://en.wikipedia.org/wiki/Database_normalization) – GurV
您不應將多個數字保存到同一列。要麼有更多的列或「子」表。 (或另一個數據庫是這樣設計的[MongoDB f.e.]) – Jeff