如何使用PHP在同一SQL列中存储多个记录?

3
有什么适合使用PHP将多个值存储在同一SQL列中的方法呢?
例如,在保存联系人/客户详细信息并允许您添加多个电话号码的系统中。例如,您可能会为同一个客户保存2个移动电话号码、1个办公室电话和几个其他号码。
但是我不太明白如何在单个列中保存这些数据而不是创建家庭电话号码、手机号码、工作号码等列。
在我看来,可以像JSON格式那样保存,但我可能错了。
谢谢。

1
不要这样做。始终将值分开。请参见规范化 - Gurwinder Singh
2
你不应该将多个数字保存到同一列中。要么增加更多的列或者使用“子”表格(或另一个设计为这种方式的数据库,例如MongoDB)。 - Jeff
4个回答

2
如果您想为一个联系人存储多个电话号码,应该通过多个记录来实现,而不是在同一条记录中存储多个值。例如,您可以创建一个类似下面的“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在联系人表中存储座机、移动电话和传真号码,并为座机和移动电话提供扩展选项,老实说我认为这已经足够了,但我不确定。 - user2293381

2

如果您有多个动态电话号码(如多个移动电话号码),则可以创建一个仅用于电话号码的表,并将其与客户端建立关联:

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

方法一似乎更可用,因为我可以轻松执行搜索查询并简单地提取所需的数据对象,而不是在我只需要查找传真号码时拉取所有数据对象。在我的情况下,JSON的问题将是由于我计划保持联系人信息加密,因此我不认为它会与JSON-P很好地配合使用。 - user2293381
1
我认为你是正确的,这会增加不必要的复杂性。无论如何,方法#1都是最清晰的。 - A Person

1
无法在MySQL中实现-除非您想将JSON存储在单个列中,例如联系信息,然后将所有描述的数据存储在其中,以便每次输入新数据集时不必担心数据结构。
请查看NoSQL数据库引擎,如MongoDB,您可以保存JSON,然后按列名称调用它,这意味着您不必创建严格的列,并且可以根据需要插入较短/较长的条目-比SQL数据库更灵活。

我明白了,所以要么是一个新的数据库平台,要么是处理JSON,这会带来一定的限制,特别是如果尝试使用PHP运行搜索查询。我想我会坚持在联系人表中使用座机+移动电话列,因为我还计划向MySQL数据添加AES加密,这将使在处理JSON时变得非常困难。我提出问题的原因是因为我看到一些论坛软件和CRM软件将数据存储为MySQL中的{1:something,2:something,3:something}。 - user2293381

1
通常情况下,它保存为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数据集非常大,则这将变得很麻烦。 - user2293381
1
在当前项目中,我使用这种方法来保存对象状态数据,并且在查询时使用对象ID。一些对象状态保存在单独的列中以便在查询中进行过滤。 @0111010001110000 - Pavlo Zhukov
但是,如果 SQL 数据是 AES-256 加密的呢?我很担心这个问题,因为这意味着在 JSON 中,您需要解密大块数据,而不是只解密您正在查找的数据。此外,我不知道 JSON 如何处理加密数据,是否存在数据损坏的可能性,因为您知道,您无法修复已被损坏的加密数据。 - user2293381
在当前项目中,它被存储为 SQL 表中的 BLOB 类型。类似的 PHP 数组已成功保存。对于 AES-256 我不是很熟悉,抱歉。 - Pavlo Zhukov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接