2017-04-15 7 views
3

PHPの助けを借りて同じSQLカラムに複数の値を格納する適切な方法は何でしょうか。複数のレコードをPHPで同じSQLカラムに保存する方法は?

たとえば、連絡先/クライアントの詳細を保存し、さらに1つの電話番号を追加できるシステムでは、たとえば、2つの携帯電話番号、1つのオフィス番号、他の2つの番号を同じクライアントに保存することができます。

しかし、私はあなたがHome#、Mobile#、Work#およびectの列を作成することと比較して、このデータを単一の列に保存する方法を理解していません。

私の理解では、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では、contact_informationなどの単一の列にJSONを保存し、そこに記述したすべてのデータを保存しない限り、入力するたびにデータ構造について心配する必要がない限り新しいデータセット。

JSONを保存した後、厳密な列を作成する必要がなく、必要に応じてより短い/長いエントリを挿入できるという意味で、列名で呼び出すことができるMongoDBなど、SQLデータベースよりも柔軟性があります。

+0

私は、新しいDBプラットフォームか、特にPHPで検索クエリを実行しようとすると、特定の制限をもたらすJSONのどちらかを扱っています。私はContact Tableの固定電話+モバイルの列に固執すると思いますが、MySQLデータにAES暗号化を追加する予定です.JSONを使って作業する場合、真の悪夢になります。私の質問の理由は、いくつかのフォーラムソフトウェアとcrmソフトウェアがMySQLに{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 | 
+-----------+-----------+-----------+ 
... 

があればあなたは本当にクライアントの1つの列にすべての数値を保存したいと思っています。それはあなたがそれを行う方法です:

# 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が最もクリーンです。 –

関連する問題