我想创建一个如下表格:
id| timestamp | neighbour1_id | neighbour1_email | neighbour2_id | neighbour2_email
and so on upto max neighbour 20.
我有两个问题:
我的jsonArray看起来像是:
{id:123, email_id:abc, neighbours: [{neighbour1_id:234, neighbour1_email: bcd}, {neighbour2_id:345, neighbour2_email:dsf}, {}, {}...]}
请指教。谢谢。
答案 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;