将表精确映射到三个

问题描述 投票:0回答:1

我有下表(取自更大的模式)。它对于最初的目的来说效果很好(即,可以选择仅将父级

category
映射到
wallets_balance_history
表)。

enter image description here

现在,当我们引入子类别(即类别级别 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 语句。

sql oracle hierarchical-data
1个回答
0
投票

不要使用多个表。

选项 3:

创建一张表,并具有分层数据结构,并具有指向同一个表的主键的引用约束:

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
)

如果您想查询类别,请使用分层查询。

© www.soinside.com 2019 - 2024. All rights reserved.