Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是在MySQL中存储JSON的合理用例吗?_Mysql_Json_Database Design_Extjs4_Inventory Management - Fatal编程技术网

这是在MySQL中存储JSON的合理用例吗?

这是在MySQL中存储JSON的合理用例吗?,mysql,json,database-design,extjs4,inventory-management,Mysql,Json,Database Design,Extjs4,Inventory Management,我理解,通常认为在MySQL列中存储JSON是一个“坏主意”,因为它变得难以维护,不容易搜索或查询。然而,我觉得我在应用程序中遇到的场景是在MySQL表中存储JSON数据的合理用例。我确实在寻找一个答案,特别是一个可以指出我可能忽视的任何困难的答案,或者如果有任何好的理由来避免我的计划,如果是的话,另一种方法 手头的应用程序提供资源和库存管理,并支持生成部件,其中可能包含无限多个子部件 我有一个表,其中包含项目的所有元数据,例如名称、sku、零售价格、维度,以及最重要的问题:项目类型。项目可以是

我理解,通常认为在MySQL列中存储JSON是一个“坏主意”,因为它变得难以维护,不容易搜索或查询。然而,我觉得我在应用程序中遇到的场景是在MySQL表中存储JSON数据的合理用例。我确实在寻找一个答案,特别是一个可以指出我可能忽视的任何困难的答案,或者如果有任何好的理由来避免我的计划,如果是的话,另一种方法

手头的应用程序提供资源和库存管理,并支持生成部件,其中可能包含无限多个子部件

我有一个表,其中包含项目的所有元数据,例如名称、sku、零售价格、维度,以及最重要的问题:项目类型。项目可以是零件或部件。对于定义为程序集的项,其内容存储在另一个表中,
item\u assembly\u contents
,该表的结构是预期的,使用
parent\u id
列将子项链接到父项。正如您所期望的,用户可以随时决定从程序集中添加或删除项,或者以其他方式修改程序集内容或将其完全删除

下面是上表说明的可视化表示,其中填充了数据,这些数据在组成时会创建一个包含另一个程序集的程序集。 使用上述结构,从
项目
表中删除的任何项目也将通过InnoDB
ON DELETE CASCADE
项目集合内容
表中自动删除

下面是一个JSON格式的非常简单的示例程序集,演示了单个子程序集结构

{
   "id":1,
   "name":"Fruit Basket",
   "type":"assembly",
   "contents":[
      {
     "id":10,
     "parent_id":1,
     "name":"Apple",
     "type":"part",
     "quantity":1
      },
      {
     "id":11,
     "parent_id":1,
     "name":"Orange",
     "type":"part",
     "quantity":1
      },
      {
     "id":12,
     "parent_id":1,
     "name":"Bag-o-Grapes",
     "type":"assembly",
     "quantity":1,
     "contents":[
        {
           "id":100,
           "parent_id":12,
           "name":"Green Grape",
           "quanity":10,
           "type":"part"
        },
        {
           "id":101,
           "parent_id":12,
           "name":"Purple Grape",
           "quanity":10,
           "type":"part"
        }
     ]
      }
   ]
}
果篮是一个组件,其中包含一个名为“Bag o Grapes”的子组件。这一切都非常有效,直到考虑到订单和装运

例如,包含部件的出站装运。在任何时候,用户都必须能够看到组件的内容,正如它们在装运时定义的那样,这就排除了简单地从
项目
项目(组件)内容
表检索数据的可能性,因为这些表可能在装运创建后已被修改。因此,部件内容必须与装运一起明确保存,以便以后可以查看它们,而不受用户定义的库存(即
项目
表)中部件的状态或存在的影响

它将程序集内容与装运内容一起存储,这让我有点困惑,在我看来,将数据存储在JSON中是一个可视的解决方案。了解有关此数据的以下几点至关重要:

  • 它将用于搜索
  • 任何更新都将覆盖该行的内容
  • 它将最常见的用于在客户端上填充树视图,该视图将接受JSON,因为它存在于表中,无需任何修改 请参见此图,以(希望)更清晰地显示数据:

    问题

  • 这是一个合理的用例吗?我的担心是否毫无意义
  • 有什么我看过的东西可能会回来咬我吗
  • 你能解释一下为什么我不应该继续我的计划吗?如果是的话
  • 你能提供另一种方法吗
  • 一如既往,非常感谢您抽出时间,请随时要求澄清或补充信息

    更新 根据per的建议(如下),我提出了另一个建议的表结构,它使用了与order_assembly_contents表的反射或“兔子耳朵”关系。请参见下图:


    我觉得这比直接存储JSON要优雅得多,因为数据更加关系化和数据库友好。检索数据并为客户端生成数据也应该很容易!请提供有关上述结构的任何输入

    通常,对于订购系统,我希望

    Product -< OrderLine >- Order 产品--订单
    在您的情况下,您可以在产品上添加一个“兔子耳朵”关系来表示其自身。因此,您的
    出站装运内容将丢失
    名称
    类型
    到新的
    产品
    。然后,您可以递归地建立要根据需要拾取的项目树。

    这似乎是一个标准的BOM表问题,并且有很多关于SQL和BOM表模式的好文章。我会避免使用JSON存储,因为它会使依赖于本机SQL的任何报告和详细连接功能变得复杂。对于您的应用程序,您可以在数据访问层中为UI构建JSON


    IMHO:在关系数据库中保持数据干净、高度可访问和关系化,在数据访问/低级别业务层重新调整应用程序的用途。

    如果不存储关系数据,为什么要使用关系数据库管理系统?为什么不把你的JSON文件(就是这样)存储在一个高度优化的文件存储数据库(即你的文件系统)中呢?@eggyal这是一个非常好的观点,也是我觉得我提出的表结构是一个丑陋的解决方案的原因之一。我希望以关系的方式存储这些数据,但是我正在努力以一种允许我这样做的方式来构造表。感谢我在阅读有关该主题的文章时提到材料清单。我同意你的回答,只是不知道如何根据我的需要构建数据库?对这件事有什么想法吗?再次感谢你!我将抽象模式以将顺序视为介于