相对于通过关系(使用laravel关系)访问的属性表中存储模型可以拥有的所有属性,而不是将所有属性/设置存储在同一表中但在json列中,我希望获得一些反馈。
当前,我的应用程序具有一个称为“设置”的属性表,该表本质上也是多态的,因此多个模型可以在其中存储其属性。该表具有类似
的列package dev.gigaboy.chat;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public class IOThread extends Thread {
protected DataInputStream in;
protected DataOutputStream out;
public IOThread() {
}
public DataInputStream getReader() {
return in;
}
public DataOutputStream getWriter() {
return out;
}
public String readUTF() throws IOException {
return in.readUTF();
}
public void close() throws IOException {
in.close();
out.close();
}
}
所以我不发送字符串到javascript前端,而是可以发送字符串,整数,布尔型本机类型,以便更好地处理前端中的类型。我先进行此转换,然后再使用php函数将属性发送到前端,该函数根据类型将字符串值转换为int,boolean,json或string。
这意味着如果一个模型有40个属性,则所有属性都存储在其自己的行中,因此创建一个模型将导致创建40个行,以存储其可能具有的所有属性。
现在上面的方法与方法只有一个json列,我们可以称之为设置,然后将所有这40个属性转储到那里。
使用json列方法能赢什么?我删除了一个表,并且删除了每次执行一些查询时都需要在此模型上加载的额外关系。我也不必每次都将属性强制转换为整数,布尔值,json或字符串。 (记住上面的类型列)要记住这些属性不需要可搜索,我只需要从它们中读取即可。我绝不会在查询中使用它们来基于这些属性返回帖子。
使用哪个更好的主意,我正在构建一个CMS,您可以在这里看到它的运行情况: https://www.youtube.com/watch?v=pCjZpwH88Z0
答案 0 :(得分:2)
只要您不尝试使用属性进行搜索或排序,就没有太大区别。
正如您所说,在模型表中放置JSON列可以避免加入属性表。
我认为您的属性表实际上需要再增加一列以命名属性。所以应该是:
key (string),
property (string),
value(string),
type (string) - tells if the value is of string, integer, boolean, json type
两种解决方案的缺点都非常相似。
使用这两种解决方案的查询都将更加复杂。
将非字符串值存储为字符串效率不高。将数字或日期时间值存储为字符串比存储本机数据类型需要更多的空间。
您不能将约束应用于属性。无法使属性成为强制性(对于常规列,您将使用NOT NULL)。无法实施唯一性或外键引用。
我可以想到一种情况,它使JSON更具优势。如果您的自定义属性之一本身就是多值的,则有一种直接的方法可以在JSON中表示此值:作为JSON文档中的数组。但是,如果您尝试使用属性表,则是否为一个属性存储多行?还是将一组值序列化为一行中的数组?两种解决方案都感觉很麻烦。
由于“无模式属性”模式仍然会破坏关系数据库设计的规则,因此“正确执行”的工作量不大。您选择的是两种弊端中的较小者,因此可以随意使用使代码更方便的解决方案。