我有下表(取自更大的模式)。它对于最初的目的来说效果很好(即,可以选择仅将父级
category
映射到 wallets_balance_history
表)。
现在,当我们引入子类别(即类别级别 1 和 2)时,需要对此进行更改。
本质上,我需要修改此架构,以便可以查询
wallets_balance_history
表中任何单行的所有子类别(如果有)。所有类别都是可选的,除非它们是子类别的父类别。也就是说,它们可以为 null,或者仅父级 category
,或者父级 category
和 category_level_1
,或者全部:category
、category_level_1
和 category_level_2
。但是如果没有父类别,你就不能拥有category_level_n。
选项 1: 对于每个类别级别,将 fk 添加到
wallets_balance_history
(即,添加映射到 的三列到三个类别级别)。这是最简单的,但它遵循最佳实践吗?如果类别数量增加怎么办。
选项2:
在 category
和
wallets_balance_history
表之间添加 bridge/lookup表,例如
bridge
。在此表中,我将每个类别存储在单独的行中,但所有类别共享相同的桥 ID。然后在 wallets_balance_history
表中使用该网桥 ID。桥 ID 不会被 PK(因为它在 bridge
中不是唯一的)
有更好、更清洁的选择吗? 我希望能够查询与余额历史记录相关的类别,而无需构建复杂的 if/else 语句。
不要使用多个表。
创建一张表,并具有分层数据结构,并具有指向同一个表的主键的引用约束:
CREATE TABLE categories (
id NUMBER(10,0)
CONSTRAINT categories__id__pk PRIMARY KEY,
name VARCHAR2(200),
description VARCHAR2(4000),
parent_id REFERENCES categories (id),
user_id NUMBER(10,0),
status_id NUMBER(10,0),
type_id NUMBER(10,0),
created_by VARCHAR2(20),
created_on DATE,
updated_by VARCHAR2(20),
updated_on DATE
)
如果您想查询类别,请使用分层查询。