MySQL:嵌入式 JSON 与 table

MySQL: Embedded JSON vs table

我正在为一个视频制作项目管理应用程序设计数据库架构,并且正在努力解决如何保留一些嵌入式但不是重复table 数据的问题。在我参加的少数 CS 课程中,规范化关系数据库的一部分是识别 repeatable 块并将它们封装到自己的 table 中。如果我有一个 embedded/nested 数据块,我知道该数据块可能是唯一的记录怎么办?

示例:一条 video 条记录有很多条 shoot_locations。这些位置很可能永远不会重复。 shoot_locations也可以包含多个shoot_times。在 JSON 中表示,可能如下所示:

{
  video: {
    shoot_locations: [
      {
        name: "Bob's Pony Shack",
        address: "99 Horseman Street, Anywhere, US 12345",
        shoot_times: {
          shoot_at: "2015-08-15 21:00:00",
          ...
        }
      },
      {
        name: "Jerry's Tackle",
        address: "15 Pike Place, Anywhere, US 12345",
        shoot_times: {
          shoot_at: "2015-08-16 21:00:00"
          ...
        }
      }
    ],
    ...
  }
}

选项...

  1. shoot_locations 存储在 JSON 字段中(在 MySQL 5.7.8 中可用?)
  2. 为数据创建一个单独的 table。
  3. 还有别的吗?

我觉得我应该将嵌入式数据拆分成它自己的 table 并保存 JSON 用于非关键元数据。

总结

存储非重复嵌入数据的最佳选择是什么?

规范化数据库的原因之一是减少冗余(您的"repeatable blocks")

另一个原因是允许 "backwards" 查询。如果你想知道哪个视频是在“15 Pike Place”拍摄的,你的 JSON 解决方案将失败(你将不得不求助于顺序读取,解码 JSON 这违背了 RDBMS 的目的)

好的经验法则:

  • 结构化数据 - 放入表和列中
  • 可能属于查询条件的数据 - 放入表和列中
  • 您知道永远不会查询的非结构化数据 - 放入 BLOB、XML 或 JSON 字段

如有疑问,使用表和列。最初您可能需要多花一些时间,但您永远不会后悔。人们一次又一次地后悔选择 JSON 个字段(或 XML,就此而言)。我有提到 "again" 吗?