mysql - 属性表模式与将所有属性存储在 json 列中

标签 mysql json database-design entity-attribute-value

<分区>

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

目前,我的应用程序有一个名为 settings 的属性表,它本质上也是多态的,因此多个模型可以在其中存储它们的属性。这个表有像这样的列

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

这样我就不会将字符串发送到 javascript 前端,而是可以发送字符串、整数、 bool native 类型,以便更好地处理前端的类型。在使用将字符串值转换为 int、 bool 值、json 或字符串的 php 函数将属性发送到前端之前,我会执行此转换,具体取决于类型。

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

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

我用 json 列方法有什么好处?我去掉了一张表,也去掉了每次我做一些查询时需要加载到这个模型上的额外关系。我还省去了每次获取属性时将它们转换为整数、 bool 值、json 或字符串的麻烦。 (记住上面的类型列)要记住这些属性不需要是可搜索的,我只需要它们来读取它们。我永远不会在查询中使用它们来返回基于这些属性的帖子。

使用哪个更好,我正在构建一个 CMS 顺便说一下,您可以在此处查看它的实际效果: https://www.youtube.com/watch?v=pCjZpwH88Z0

最佳答案

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

如您所说,在模型表中放置一个 JSON 列可以避免连接到属性表。

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

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

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

  • 与查询普通列相比,使用任一解决方案的查询都会更加复杂。

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

  • 您不能对属性应用约束。没有办法使属性成为强制性的(您将对普通列使用 NOT NULL)。无法强制执行唯一性或外键引用。

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

因为“无模式属性”模式无论如何都打破了关系数据库设计的规则,所以您无能为力地“正确地做事”。您正在选择两害相权取其轻,因此您可以随意使用让您的代码更方便的解决方案。

关于mysql - 属性表模式与将所有属性存储在 json 列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55854169/

相关文章:

mysql管道三通缓冲区输出

java - 如何将对象数组从 javascript 传递到 Java

mysql - 订单和子订单的数据库设计

php - MySQL PDO 计数函数返回不正确的多个 WHERE 条件

mysql - 从表中复制字段以在另一个表的查询中使用

mysql - 如何解决不正确的字符串值错误 (MySQL)

Angularjs 选择多个选项不起作用

javascript - 将数组更改为 json

MySQL数据库结构: more columns or more rows?

mysql - 删除 : use DELETE or use a valid/non-valid COLUMN? 的最佳关系数据库方法