是否有允许用户设置自定义字段的示例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脚本都已经这样做了,所以我可以把它拆开来理解?
答案 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)
您始终可以拥有一个包含对象之间通用列的表。比如示例中的ID
和Name
。还有一个名为Data
的附加列,您可以在其中存储每个对象的custom fields
的其余部分。它可以存储在json
,xml
或serialized php object
中。
您可以查看php serialize 和unserialize函数。
答案 2 :(得分:1)
有很多方法可以自定义字段。各有利弊。
通常不建议进行序列化。虽然它有时会有其用途,但是你失去了很多关系数据的关系。您也没有任何有效的索引或搜索特定字段的方法。
使所有数据字段关系可以创建非常复杂的查询/连接,以便在需要时访问数据。
使用MongoDB可能是一种选择。您可以为每个数据集创建唯一的集合,并为每个集合添加适当的索引。它的模式更少你不必做任何表创建。只需插入数据。但您确实需要花时间了解其局限性。
根据您的数据集,另一个选项可能是提供用于自定义数据的字段,而公共字段将是普通行的一部分。您可以限制自己可以提供的自定义字段数量。