在我的 sql 数据库中存储自定义报告设置的推荐架构/数据库设计是什么?

What is a recommended schema / database design to store custom report settings in my sql database?

我正在构建一个工具,让人们可以创建自定义报告。我的问题围绕获得正确的数据库架构和设计以支持某些自定义报告设置而解决。

在设计方面,我有各种 幻灯片,每个 幻灯片 都有一堆设置(如日期范围等)。 报告 基本上是幻灯片的有序列表

要求是:

  1. 用户可以通过按他们希望的任何顺序将 "Slides" 列表放在一起来创建报告
  2. 用户可以在具有不同设置的报告中包含同一张幻灯片两次

所以我在考虑下表:

报告 Table: ID、姓名、描述
幻灯片 Table:、ID、说明
ReportSlide Table: ReportId、SlideId、订单、SlideSettings

我的两个主要问题是:

  1. Order:这是管理用户可以在任何给定报告上订购幻灯片的最佳方式吗

  2. SlideSettings: 因为每张幻灯片都有一组不同的设置(输入),我正在考虑将其存储为一个 json blob然后在前端解析出来。有人认为这是错误的设计吗?有没有更好的方法来存储此信息(同样,每张幻灯片都有不同的输入,您可以在报告中将同一张幻灯片列出两次,每次使用不同的设置

也许您应该有一个设置 table。您可能还需要一个 ValueTypes table 来定义哪个设置可以采用什么样的值。 (例如日期范围)。然后让设置 ID 列表存储在幻灯片上。

不用说,这些 "best way" 将取决于存储的数据类型和数量等。我是 JSON 等方面的新手,但据我所知,这不是一个好主意将 JSON 字符串保留为数据库字段的想法,但不是规则。

我认为,从高层次的角度来看,您的架构会起作用。但是,您可以考虑修改一些 table 结构。例如:

设置

最好为 ReportSlide table 的每个设置添加列,而不是 JSON blob。根据您允许的输入,为每个输入一列。例如,您的日期范围需要包含 StartDate/EndDate、整数、文本字段等

幻灯片 Table 有什么作用?如果您的数据库允许 Slides 和 Reports 之间存在多对多关系,那么 ReportSlide table 将包含您的所有设置。你的幻灯片 Table 会有属性吗?如果没有,那么 Report Slides 可能就是您所需要的。例如:

Report Table: ReportID | DateCreated | UserID | Description
ReportSlides Table: ReportSlideID | ReportID | SlideOrder | StartDate | EndDate | Description...

除非您的幻灯片 table 将包含在每个报告中通用的特定属性,否则您不需要额外的联接或 space。

根据工具的不同,您可能还希望具有 DateCreatedUserIDFolderID 等允许人们组织报告的属性。

如果幻灯片相互依赖,您将需要添加约束,以便在幻灯片 3 依赖时无法删除幻灯片 2。

订单

关于顺序,使用 SlideOrder 列即可。因为每个ReportSlideID都会有对应的Report,所以SlideOrder还是可以改的。这样,如果 ReportSlideID = 1 属于 ReportID = 1 并且具有特定设置,它可以在第 7 或第 3 次订购并且仍然有效。

注意您的命名约定。如果 Order 列直接引用 Slide Order,则继续并将其命名为 SlideOrder。

我相信还有一百万种其他方法可以提高效率。这是我根据您提供的内容的初步想法。

报告Table:ID(主键),名称,描述,....

幻灯片 Table:ID (PK),名称,描述,...

Slide_x_report Table: ID(PK), ReportID (FK), SlideID (FK), order

Slide_settings Table: ID(PK), NameSetting, DescriptionSettings, SlideXReportID (FK),...

我认为你应该有这样的结构,并且在 Slide_settings table 中你将根据报告设置不同的幻灯片。

假设 slide_settings table 可能包含动态表单,并且这些表单应该与报告的特定幻灯片相关,这样您就可以将其全部正确存储并且 slide_settings table,您将只有定义幻灯片元素所需的列。

Order: Is this the best way to manage

这是正确的方法。

SlideSettings: ... storing this as just a json blob

如果您从不打算查询这些值,那也没关系。

您可能想要将 ReportSlide 重命名为 SlideInReport。关系不应仅列出引用的表,而应列出关系的性质。

有些人(我)更喜欢给 PK 列和 FK 列相同的名称。那么你不能只使用 Id,但你需要调用它们 sld_id, rep_id.