Php 根据条目数动态更新sql列

Php 根据条目数动态更新sql列,php,sql,arrays,Php,Sql,Arrays,我想创建一个如下表: id| timestamp | neighbour1_id | neighbour1_email | neighbour2_id | neighbour2_email and so on upto max neighbour 20. 我有两个问题: 我应该静态创建列,还是有一种基于json数组计数使用php动态创建列的方法 在这两种情况下,我如何动态引用列并基于jsonArray为它们赋值 我的jsonArray看起来像: {id:123, email_id:abc,

我想创建一个如下表:

id| timestamp | neighbour1_id | neighbour1_email | neighbour2_id | neighbour2_email 
and so on upto max neighbour 20.
我有两个问题:

  • 我应该静态创建列,还是有一种基于json数组计数使用php动态创建列的方法
  • 在这两种情况下,我如何动态引用列并基于jsonArray为它们赋值
  • 我的jsonArray看起来像:

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

    请给我一些建议。谢谢

    看起来您需要重新考虑一下数据库结构。在我看来,您需要一个单一的用户(或其他用户)表:

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

    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或MunGDB),但是这完全是另一回事。p> 只是重复一堆列x次绝对不是办法。关系数据库中表的垂直大小(行)不是什么大问题,它们就是为此而设计的。但是,水平大小(#列)是需要小心的,因为它可能会使您的db UANESSACR过大,并降低性能


    如果你想找到一个有电子邮件地址的邻居[X]的用户,你可以考虑一下。对于每个可能的电子邮件列,您必须重复where语句20次。这只是一个例子…

    好吧,当佩瓦拉发布他们的更快时,我正在研究的答案几乎是一样的

    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;
    

    简单的答案是,绝对不应该使用列,但应该研究数据库规范化和使用关系表让我提供更多关于我的情况的细节。这里的主要用户是基本设备。邻居是附近的设备。我必须每1分钟对数据进行一次采样,以发送相邻设备相对于基本设备的信号强度。这是一个间隔集合,我需要在其中动态记录数据。因此,我的邻居会经常改变。我还需要过去的数据。
    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;