【问题标题】:storing dynamic form and data entered using json存储使用 json 输入的动态表单和数据
【发布时间】:2013-02-03 02:24:30
【问题描述】:

我是使用 JSON 的新手。我知道这可能已经被问到这里,但是,我只是想咨询一下我是否在做正确的事情。

我需要为不同的页面创建一个动态表单。我需要能够为每个页面添加一个动态表单。在管理面板中,我可以在页面模板中添加/编辑/删除字段——更改字段的顺序、名称、类型、值等。

所以,我做了什么,我将动态表单字段存储在 json 中,对于每个页面中输入的数据,我也将其存储在 json 中。以下是存储在我的数据库中的示例 JSON 数据:

具有 2 个字段的动态表单的 JSON 结构:

{
"0":{
  "id":"511ddf15cb8ae_1", // generated using uniqid() and counter, to generate a unique id for each field
  "name":"Page Name #1",
  "type":"textfield",
  "validation":"email", 
  "require":"on",
  "value":""  //default value
},
"1":{
  "id":"511ddf15cb8ae_2",
  "name":"Field Name #2",
  "type":"checkbox",
  "validation":"none",
  "require":"on",
  "value":["item 1","item 2","item 3"]  //selection
}
}

存储的输入值的 JSON:

{
"511ddf15cb8ae_1":   //the field id, used as key to be able to directly access the data
  "test new data",
"511ddf15cb8ae_2":
  ["item 1","item 2"]
}

我的主要问题是,是否可以使用 json 将输入的值存储在数据库中,还是应该单独存储输入的值 -- db 表行。

任何想法以更好的方式做到这一点,或者这已经很好了吗?谢谢。

干杯

【问题讨论】:

    标签: jquery json forms dynamic


    【解决方案1】:

    取决于你接下来的计划:)。

    如果您只打算稍后重建表单并使用输入的值填充(我相信您也在存储动态表单),那么您采用的方法非常好,因为您不需要使用复杂查询从输入的值重新构造 json。

    但是,如果您稍后对在各个字段中输入的值进行一些复杂的发现/查询,例如“特定用户在特定字段中输入特定值多少次?”,那将是乏味的。的种类。如果您打算这样做,那么我建议您使用关系方法并将它们存储在表格中;动态表单和输入的值。

    【讨论】:

    • 您好,感谢您的反馈,非常感谢。是的,我在考虑可能的复杂查询,这就是为什么我的第一个计划是将字段单独存储在表中。但我担心的是,如果有数千页怎么办,那么它可能会占用数据库中的大量空间,因为,是的,我也将存储动态表单。我想我会坚持存储整个json 字符串暂时在表中。
    【解决方案2】:

    将其作为字符串存储在 SQL 数据库中是可以的,因为您始终可以使用 stringifyparse,但我发现这非常乏味,尤其是当我想要执行 JOIN 操作或持久表示复杂结构时。既然您已经在 J​​SON 中拥有它,为什么不使用像 MongoDB 这样的 NoSQL 持久存储机制并存储 JSON 本身。

    MongoDB allows you to save JSON documents in BSON format,然后对它们进行查询,这是您当前的实现所缺乏的。

    事实上,您可以在他们的网站上打开交互式 MongoDB shell,并从那里使用类似这样的方式创建您的数据库原型:

    > var page = {"name":"Page Name #1",   "type":"textfield",   "validation":"email",    "require":"on",   "value":"aValue"};
    {
     "name" : "Page Name #1",
     "type" : "textfield",
     "validation" : "email",
     "require" : "on",
     "value" : "aValue"
     }
    > db.pages.save(page);
    "ok"
    

    从那里,一旦添加了所有页面,您现在就可以进行稳健的查询,例如,这将找到所有文本字段类型的页面:

    db.pages.find({"type":"textfield"});
    

    您还可以使用 values 字段执行更复杂和更强大的查询,但我将把它留给您。

    【讨论】:

    • 您好,感谢您的推荐,这似乎是一个非常好的主意。但是我们已经在使用 mysql 数据库进行数据存储了。
    • 您确实会冒着一些严重的问题将其以字符串形式放入数据库中,尤其是真正的搜索,至少对于压缩而言,我可以推荐BSON 以节省空间
    • 顺便说一句,我正在使用 codeigniter,它有什么不同吗?还是将json字符串存储在数据库中只是不好的做法?谢谢。
    • 如果它对你有用,这不是坏习惯,只是关系数据库的重点是拥有可索引的标准化数据,以便于查询,你使用它的方式是就像您只是将 JSON 文件读取和写入磁盘一样,因此您没有充分利用工具的全部功能。
    猜你喜欢
    • 1970-01-01
    • 2018-12-29
    • 2016-11-16
    • 2019-01-24
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多