属性表模式与将所有属性存储在 json 列中[重复]

2024-02-17

我想要一些关于模型可以在通过关系访问的属性表中拥有的所有属性(使用 Laravel 关系)与将所有属性/设置存储在同一个表中但在 json 列中的反馈。

目前,我的应用程序有一个名为“设置”的属性表,它本质上也是多态的,因此多个模型可以在其中存储其属性。该表有如下列

key (string), 
value(string), 
type (string) - tells if the value is of string, integer, boolean, json type 

这样我就不会将字符串发送到 javascript 前端,而是可以发送字符串、整数、布尔本机类型,以便更好地处理前端中的类型。在使用 php 函数将属性发送到前端之前,我会进行此转换,该函数根据类型将字符串值转换为 int、boolean、json 或 string。

这意味着如果一个模型有 40 个属性,所有属性都会存储在其自己的行中,因此创建一个模型会导致创建 40 行来存储它可能具有的所有属性。

现在,上面的方法与我只有一个 json 列的方法相比,我们可以将其称为设置,然后将所有这 40 个属性转储到那里。

使用 json 列方法可以赢得什么?我删除了一个表,并删除了每次执行一些查询时都需要加载到该模型上的额外关系。我还不必每次获取属性时都将它们转换为整数、布尔值、json 或字符串。 (记住上面的类型列)要记住这些属性不需要可搜索,我只需要它们来读取它们。我永远不会在查询中使用它们来返回基于这些属性的帖子。

使用哪一个更好,我正在构建一个 CMS 顺便说一句,你可以在这里看到它的实际效果:https://www.youtube.com/watch?v=pCjZpwH88Z0 https://www.youtube.com/watch?v=pCjZpwH88Z0


只要您不尝试使用这些属性进行搜索或排序,就没有太大区别。

正如您所说,将 JSON 列放入模型表中可以避免 JOIN 到属性表。

我认为您的属性表实际上需要多一列来命名属性。所以应该是:

key (string), 
property (string),
value(string), 
type (string) - tells if the value is of string, integer, boolean, json type 

两种解决方案的缺点非常相似。

  • 与查询普通列相比,这两种解决方案的查询都会更加复杂。

  • 将非字符串值存储为字符串的效率很低。将数字或日期时间值存储为字符串比存储为本机数据类型需要更多的空间。

  • 您无法对属性应用约束。无法强制指定属性(对于普通列,您可以使用 NOT NULL)。无法强制执行唯一性或外键引用。

我能想到的一个案例给 JSON 带来了优势。如果您的某个自定义属性本身是多值的,则有一种简单的方法可以在 JSON 中表示它:作为 JSON 文档中的数组。但是,如果您尝试使用属性表,是否会为一个属性存储多行?或者将一组值序列化为一行数组?这两种解决方案都感觉很糟糕。

因为“无模式属性”模式无论如何都违反了关系数据库设计的规则,所以您无法做太多事情来“做对”。您选择了两害相权取其轻,因此您可以随意使用使您的代码更方便的解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

属性表模式与将所有属性存储在 json 列中[重复] 的相关文章

随机推荐