当前位置: 首页 > 知识库问答 >
问题:

属性表模式vs将所有属性存储在json列中[duplicate]

别兴国
2023-03-14

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

目前,我的应用程序有一个名为settings的propeties表,它在本质上也是多态的,因此多个模型可以在那里存储它们的属性。此表有如下列:

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列的方法相比,我们可以称之为settings,并且我将所有这40个属性都转储在那里。

我用json列方法赢得了什么?我删除了一个表,并且删除了一个额外的关系,每次我执行一些查询时都需要加载到这个模型上。我还避免了每次获取属性时必须将它们转换为integer、boolean、json或String。(记住上面的type列)要记住,这些属性不需要是可搜索的,我需要它们只是为了从中读取。我永远不会在查询中使用它们来返回基于这些属性的帖子。

使用哪一个更好,我正在构建一个CMS btw,您可以在这里看到它的作用:https://www.youtube.com/watch?v=pcjzpwh88z0

共有1个答案

步衡
2023-03-14

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

正如您所说的,在您的模型表中放入一个JSON列允许您避免连接到properties表。

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

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

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

>

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

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

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

    我能想到的一种情况使JSON具有优势。如果您的一个自定义属性本身是多值的,那么在JSON中有一种简单的方法来表示它:作为JSON文档中的一个数组。但如果尝试使用属性表,是否为一个属性存储多行?还是将一组值序列化为一行上的数组?两种解决方案都感觉很好。

    因为“无模式属性”模式破坏了关系数据库设计的规则,所以您无法做太多“正确”的事情。您是在两害相权取其轻,因此您可以随意使用使代码更方便的解决方案。

  •  类似资料:
    • 在我的Spring Boot应用程序(基于JHipster 4)中,我试图使用属性表达式根据Spring文档中描述的相关实体的属性来过滤我的查询:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-方法。查询属性表达式 我想得到所有的约会,在他们的约会计划中有一个特定的雇员帐户

    • 什么类型的价值适合于此?值应该只是布尔值(根据主模式),或者可以是布尔值或字符串(在正确的地方引用基资源)。我使用的JSON验证器不允许值为布尔值以外的任何值,我在JSON规范中搜索了很多,但没有关于它的信息。

    • 问题内容: 我使用这种方法在HTML标记中存储数据,如下所示: 然后,我在这样的回调中检索数据: 很好 我所坚持的是尝试保存对象,而不仅仅是保存其属性之一。我试图这样做: 然后,我尝试像这样访问name属性: 日志告诉我。所以好像我可以在属性中存储简单的字符串,但不能存储JSON对象… 我也尝试过使用这种语法的孩子,但运气不好: 关于使用该方法如何在HTML标签中存储实际对象的任何想法? 问题答案

    • 问题内容: 我需要将JSON对象放入HTML元素的属性中。 HTML不必验证。 昆汀回答: 将JSON存储在有效HTML5 的attribute中。 JSON对象可以是任何大小-即巨大 如果JSON包含特殊字符怎么办? 例如 昆汀回答:按照常规惯例,将JSON字符串放入属性之前,先对其进行编码。 对于PHP,请使用 函数。 编辑-使用PHP和jQuery的示例解决方案 将JSON写入HTML属性:

    • 问题内容: 可以说我有一个由几个属性(ID,名称,Surename,Age)组成的对象(用户)。哪种方法最好在Redis中存储该对象? 将每个属性值存储在专用密钥中,例如,用户:{id}:id,用户:{id}:name,用户:{id}:surename,用户:{id}:age 将整个User对象作为JSON字符串存储在一个密钥中,例如user:{id}:json(密钥的值将如下所示:{“ ID”:

    • 使用自定义属性扩展JSON模式有效吗? 我问这个问题的原因是,因为我使用一个模式来为该模式描述的JSON呈现一个表单(模式中描述的每个属性都用作带有标签和某种输入的表单元素)。 能够使用一些我主要用于表单呈现的属性来扩展模式是很有用的,但是当使用模式来验证JSON对象本身时,就会忽略这些属性。 对于JSON对象,我可以有两种不同的表示形式(一种是模式,另一种是类似模式的对象,它具有自定义属性,我只