0

是否有任何示例 PHP 应用程序允许用户设置自定义字段?

比如通讯录等。比如在mySQL中设置一个没有数据库列的字段为Home、Home Away等。能够拥有尽可能多的字段并根据需要命名。

所以结果可能是:

| #   | Name  | DOB    | Address 1     | Health  
| 1   | Scott | 7/1/12 | 2222 Jackson  |  GOOD

另一组数据可能是

| # | Name  | Expertise Level | Contact Info    
| 1 | Scott | High            | 408-555-5555

我很好奇这是怎么做到的。一切都会作为 JSON 存储在单个 mysql 表中吗?以及如何存储每个字段的数据?

那里有任何 PHP 脚本已经这样做了,所以我可以把它拆开来理解?

4

3 回答 3

10

由于您已将其标记为 MySQL,因此您可以通过多种方式获得灵活的数据库表。您可以创建一个包含名称-值-对的表,类似于:

create table YourTable
(
  id int,
  name varchar(50),
  attribute varchar(50),
  value varchar(50)
);

insert into yourtable
values(1, 'Scott', 'DOB', '07/01/2012'),
  (1, 'Scott', 'Address 1', '2222 Jackson'),
  (1, 'Scott', 'Health', 'Good'),
  (1, 'Scott', 'Expertise Level', 'High'),
  (1, 'Scott', 'Contact Info', '408-555-5555');

这也称为Entity-Attribute-Value. 使用这种类型的结构有利也有弊。

为了查询此数据,您必须执行多个连接,或者您可以旋转数据以将其放入列中。

这是关于 DBA.SE 的一个问题,它概述了这种类型的结构 (EAV)。

您可以使用带有CASE语句的聚合函数查询数据:

select id,
  name,
  max(case when attribute = 'DOB' then value end) DOB,
  max(case when attribute = 'Address 1' then value end) Address1,
  max(case when attribute = 'Health' then value end) Health
from yourtable
group by id, name;

如果您想执行多个连接,则查询将类似于以下内容:

select t1.id,
  t1.name,
  t1.value DOB,
  t2.value Address1,
  t3.value Health
from yourtable t1
left join yourtable t2
  on t1.id = t2.id
  and t1.name = t2.name
  and t2.attribute='Address 1'
left join yourtable t3
  on t1.id = t3.id
  and t1.name = t3.name
  and t3.attribute='Health'
where t1.attribute = 'DOB';

请参阅带有数据检索演示的 SQL Fiddle 。

于 2013-01-03T23:18:39.540 回答
1

您始终可以拥有一个包含对象之间通用列的表。喜欢IDName在你的例子中。还有一个名为的附加列,您将每个对象Data的其余部分存储 在其中。custom fields它可以存储在 中json,也可以xml作为serialized php object.

你可以看看 php序列化反序列化函数。

于 2013-01-03T23:16:42.790 回答
1

有很多方法可以做自定义字段。各有利弊。

一般不推荐序列化。虽然它有时有其用途,但您会失去很多使关系数据相关的东西。您也不会有任何有效的方法来索引或搜索特定字段。

使所有数据字段关联可以创建非常复杂的查询/连接,以便在您需要时访问数据。

使用 MongoDB 可能是一种选择。您可以为每个数据集创建一个唯一的集合,并为每个数据集添加适当的索引。它的无模式你不必做任何表创建。只需插入数据。但是,您确实想花时间了解它的局限性。

根据您的数据集,另一种选择可能是提供用于自定义数据的字段,而公共字段将成为普通行的一部分。但是,您可以提供的自定义字段数量会受到限制。

于 2013-01-03T23:18:29.837 回答