我想知道在jsonb上构建EAV的正确方法是什么。
我有一个像标准EAV中的属性
-> 值
表。
CREATE TABLE attribute_values
(
id INTEGER,
attribute_id INTEGER,
value VARCHAR(255)
);
CREATE TABLE attributes
(
id INTEGER,
name VARCHAR(255)
);
值将保存在Entity
的attributes
字段中。
CREATE TABLE entity
(
id INTEGER,
title TEXT,
attributes JSONB
);
表格
属性
创建用于控制重复属性及其类型,更好地确定属性是什么。例如,避免:{weight: 100}
和 {Weight: 100}
或 {weigh: 100}
。 值
用于处理唯一值,并包含可用值列表,如颜色(绿色,红色,白色等)。可以预加载并用于快速搜索。我看到几个选项: 1. 存储格式如下:
[{"attribute_id":1, "value":5},{"attribute_id":1, value:"text"}]
其中value_id
将是自定义值,如文本或来自Values
表的id
。但我不知道如何在这种格式上建立索引,例如如果属性10
是整数
。
2. 仅保留Attribute
表(用于控制属性名称
),并存储数据如下:
{"price": 105, "weight": 100, "color": "white"}
这种方法更适合索引
CREATE INDEX entity_index ON entity (((attributes ->> 'price')::int));
但我遇到了文本属性的翻译和唯一值的控制问题。而且我不能像选项1
中那样添加其他键:{"attribute_id":1, "value":5, "values": []}
什么是存储具有唯一控制(用于唯一属性)且具有索引机会的额外字段的最佳方法?
"1": "绿色"
,其中1是您的属性表中属性的ID。 - Konradint[]
来引用属性。它可以得到高性能结构,如此:https://imgur.com/a/TuRR2pV 。当处理int[]
时,只需要在属性表上执行简单的= ANY($ids)
查询。因此,如果数组中有一个悬空的整数,则在处理时会被简单地忽略(因为它没有被找到)。如果您使用纯粹的jsonb
对象,则您的代码应该很清楚地知道属性名称,并忽略任何无效的键(或引发错误)。 - gahooa{ name: 'shirts', spec: [ { name: 'color', type: options, required: true, items: ['black, ...'] } ] }
。在编辑时,选择类别后,您应该构建与规范属性匹配的自定义输入表单。这是我的看法。我对这个主题(解决方案)非常感兴趣。如果您采用了这种方法,了解您的进展将会很酷! - lexeme