我正在思考数据库设计,我想知道是否有人可以插话。我有一些结构化数据,我偶尔会过滤一些非结构化数据。我对性能思考了很多,所以我试图尽可能使其非规范化。人们对单独表上的索引 JSONB 列有意见吗?例如:
| (smurfs) id | name | filters (GIN index) |
|-------------+--------+-------------------------------------|
| 1 | Papa | { "color": "blue" } |
| 2 | Brainy | { "brain": "big", "color": "blue" } |
我会查询索引的 JSONB 数据。
或者:
| (smurfs) id | name |
|-------------+--------+
| 1 | Papa |
| 2 | Brainy |
| (filters) id | smurf_id | filter_type | filter_value |
|--------------+----------+-------------+--------------|
| 1 | 1 | color | blue |
| 2 | 2 | brain | big |
| 3 | 2 | color | blue |
我会将过滤器与查询数据连接起来。
有很多关于关系数据库中 JSON 滥用的讨论。这属于该类别吗?从良好设计的角度来看,其中一种会比另一种更好吗?性能更高吗?我正在尝试优化大表上的读取。似乎在第二种情况下,我有两张大桌子而不是一张。
从设计角度来看,我会以更传统的方式使用关系数据库,即将其标准化。
我会创建更多表格:
smurfs
、smurf_color
、smurf_brain
等等。我将定义属性的类型并创建索引。
如果您主要关心的是性能,这很可能是最好的选择。
注意:您还可以进行概念证明、创建 3 个模式、生成一些数据集并使用不同的过滤器测量每种情况下的搜索时间。