2017-04-15 33 views
3

在PHP的幫助下,將多個值存儲在同一個SQL列中的正確方法是什麼?如何使用PHP在同一個SQL列中存儲多個記錄?

例如,在存儲聯繫人/客戶端詳細信息的系統中,允許您添加多於1個電話號碼。例如,您可以爲同一客戶端保存2個手機號碼,1個辦公號碼和其他號碼。

但我不太瞭解如何將這些數據保存在單個列中,而不是爲Home#,Mobile#,Work#等創建一個列。

在我的理解中可能會保存爲JSON格式,但我可能是錯的。

謝謝。

+1

**不要這樣做**。始終保持值不同。請參閱[規範化](https://en.wikipedia.org/wiki/Database_normalization) – GurV

+2

您不應將多個數字保存到同一列。要麼有更多的列或「子」表。 (或另一個數據庫是這樣設計的[MongoDB f.e.]) – Jeff

回答

3

如果您想存儲給定聯繫人的多個電話號碼,您應該通過多個記錄這樣做,而不是給定記錄中的多個值。例如,你可以有一個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表可以被加入聯繫人的表中。

+0

這是我也想到的,創建一個單獨的表並存儲電話號碼從聯繫人表中綁定聯繫人ID。我目前的SQL在聯繫人表中存儲固定電話,移動電話和傳真號碼,以及固定電話和移動電話的擴展選項,說實話,我認爲這足夠了,但我不確定。 – 0111010001110000

2

在MySQL中這是不可能的 - 除非你想將JSON存儲在一個列中,比如contact_information,然後存儲你在那裏描述的所有數據,所以你不必擔心每次輸入數據結構新的數據集。

查看NoSQL數據庫工具,例如MongoDB,您可以在其中保存JSON,然後通過列名稱調用它,這意味着您不必創建嚴格的列並可根據需要插入更短/更長的條目 - 它比SQL數據庫更靈活。

+0

我看到了,所以它不是新的數據庫平臺,就是處理JSON,這會帶來一些限制,特別是如果試圖用PHP運行搜索查詢。我想我會堅持使用聯繫表中的固定電話+移動列,因爲我還計劃將AES加密添加到MySQL數據,這將使其成爲使用JSON工作時的真正噩夢。我的問題的原因是因爲我在MySQL中看到一些論壇軟件和crm軟件將數據存儲爲{1:something,2:something,3:something}。 – 0111010001110000

2

是的,它通常保存爲JSON。

$array_to_storage = ["phone1" => 911, "phone2" => 112]; 
$sql = 'INSERT INTO table (data_column) VALUES ("' . json_encode($array_to_storage) . '")'; 

但請注意,您不能像WHERE phone2 = 112那樣進行過濾查詢。但是這樣可以有效地存儲一些不需要此功能的數據。

+0

從技術上講,你不能以正常的方式查詢它,但你可以預先加載所有的電話號碼到用戶端作爲JSON和JS過濾器的真相所需的結果,但如果你有很多客戶端和JSON,這將成爲一個麻煩數據集會很大。 – 0111010001110000

+1

@ 0111010001110000在當前項目中我使用該方法來保存對象狀態數據和查詢使用對象ID。某些對象狀態保存在單獨的列中以在查詢中對其進行過濾。 –

+0

但是如果SQL數據是AES-256加密的呢?這是我關心的問題,因爲這意味着在JSON中,您需要解密大塊數據,而不是解密您只需查找的數據。另外,我不知道JSON如何處理加密數據,以及是否存在數據損壞的可能性,因爲正如您所知,您無法完全修復已損壞的加密數據。 – 0111010001110000

3

好,比如你有電話號碼的動態數字(如多個手機號碼),您可以改爲創建一個表只是電話號碼和一個關係添加到客戶端:

+-----------------------------------+ 
| 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); 
+0

方法#1似乎更加有用,因爲我可以輕鬆地執行搜索查詢,並且只需要拉取所需的數據對象,而不是拉扯所有數據對象,而我只是在尋找「傳真#」。在我的情況下,JSON的問題是由於我打算保留聯繫人信息加密,因此我不相信它會與JSON-P很好地配合。 – 0111010001110000

+1

我認爲你是對的,它會增加一層不必要的複雜性。無論如何,方法#1是最乾淨的。 –

相關問題