如何创建允许用户拥有自定义字段的PHP应用程序

时间:2013-01-03 23:10:05

标签: php mysql

是否有允许用户设置自定义字段的示例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

我很好奇如何做到这一点。将所有内容都存储为单个mysql表中的JSON吗?如何存储每个字段的数据?

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

3 个答案:

答案 0 :(得分:10)

由于您使用MySQL标记了这种方法,因此可以使用灵活的数据库表。您可以创建一个包含Name-Value-Pairs的表,类似于:

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。使用这种结构有积极的和消极的。

要查询此数据,您必须执行多个连接,或者您可以 pivot 数据以将其添加到列中。

这是question on 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 with Demo数据检索。

答案 1 :(得分:1)

您始终可以拥有一个包含对象之间通用列的表。比如示例中的IDName。还有一个名为Data的附加列,您可以在其中存储每个对象的custom fields的其余部分。它可以存储在jsonxmlserialized php object中。

您可以查看php serialize unserialize函数。

答案 2 :(得分:1)

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

通常不建议进行序列化。虽然它有时会有其用途,但是你失去了很多关系数据的关系。您也没有任何有效的索引或搜索特定字段的方法。

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

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

根据您的数据集,另一个选项可能是提供用于自定义数据的字段,而公共字段将是普通行的一部分。您可以限制自己可以提供的自定义字段数量。