根据条目数动态更新sql列

时间:2015-08-06 18:47:22

标签: php sql arrays

我想创建一个如下表格:

id| timestamp | neighbour1_id | neighbour1_email | neighbour2_id | neighbour2_email 
and so on upto max neighbour 20.

我有两个问题:

  1. 我应该静态创建列还是有办法根据json数组使用php动态创建列?
  2. 在任何一种情况下,我如何动态引用列并根据jsonArray为它们赋值?
  3. 我的jsonArray看起来像是:

    {id:123, email_id:abc, neighbours: [{neighbour1_id:234, neighbour1_email: bcd}, {neighbour2_id:345, neighbour2_email:dsf}, {}, {}...]}
    

    请指教。谢谢。

2 个答案:

答案 0 :(得分:1)

看起来您需要重新考虑一下数据库结构。对我来说,看起来你需要一个用户(或其他任何东西)表:

CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(255) NOT NULL,
  `cretaed_at` timestamp NOT NULL,
  PRIMARY KEY (`id`)
);

另一个定义这些用户之间关系的表:

CREATE TABLE `neighbors` (
  `parent` int(11) unsigned NOT NULL,
  `child` int(11) unsigned NOT NULL,
  PRIMARY KEY (`parent`,`child`)
);

现在,您可以根据需要为每个用户添加任意​​数量的邻居。获取它们就像:

SELECT * FROM `users` 
LEFT JOIN `neighbors` ON `users`.`id` = `neighbors`.`child`
WHERE `neighbors`.`parent` = ?

如果该问号将成为您从中获取邻居的用户的ID,最好使用准备好的声明。

如果它是你将要使用的所有JSON,并且查询不是一个问题,你可以考虑使用noSql数据库或文档存储(如redis或mongoDb),但这是一个完全不同的故事。

只是重复一堆列x次绝对不是要走的路。关系数据库中表的垂直大小(#行)不是大问题,它们是为此而设计的。但是水平尺寸(#columns)要小心,因为它可能会使你的db uanessacry变大,并降低性能。

如果您想找到一个拥有电子邮件地址[x]的邻居的用户,请考虑一下您的意愿。您必须为每个可能的电子邮件列重复您的where语句20次。这只是一个例子......

答案 1 :(得分:0)

嗯,我正在努力解决的问题,而pevara发布他们的答案几乎是一样的......

CREATE TABLE `neighbours` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `neighbour_email` char(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

CREATE TABLE `neighbour_email_collections` (
  `id` int(10) unsigned NOT NULL, 
  `email_id` char(64) NOT NULL,
  `neighbour_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`,`neighbour_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

insert into neighbours values (234, "bcd");
insert into neighbours values (345, "dsf");
insert into neighbour_email_collections values(123, "abc", 234);
insert into neighbour_email_collections values(123, "abc", 345);

select      * 
from        neighbours 
left join   neighbour_email_collections 
on          neighbour_email_collections.neighbour_id=neighbours.id
where       neighbour_email_collections.id=123;