另一个table中的功能依赖
Functional dependency in another table
假设有仓库,每个仓库存储特定类型的物品。
所以有带字段的表
- 仓库 - ID、名称、类型
- 项目 - ID、名称、类型
- WarehouseItem - 仓库,项目
- 类型 - ID、姓名
问题是 - 鉴于仓库仅保存具有特定类型的项目,这违反了什么数据库规范化规则?
这个数据库规范化了吗?
(问题的例子是编出来的,但是我在现实生活中基本都有这个问题。)
我只是在没有任何数据示例的情况下查看您的元数据而做出一些假设,但乍一看,您的模式似乎大部分都已规范化。从技术上讲,如果满足以下所有标准,您的 table 就是 3NF(这应该是您的目标):
- 也是1NF - 每个条目只包含原子数据(或单条信息)
- 也是2NF - No candidate key dependency meaning that when you have have a composite primary key(由多列组成的key)所有数据都依赖于整个key
- 它是 3NF - No transitive dependency meaning all data is only dependent on the primary key 而不是 table
中的其他列
请注意,也有更高的规范化形式,但它们大多是学术性的,因为您开始经历性能下降,您规范化得越多
给定这个定义:
Warehouse
出现3NF假设每个仓库只能有一个Type
。如果不是,那么您将无法通过传递依赖,并且需要将 Type
信息移动到新的 table.
Item
也出现 3NF 假设只能分配一个 Type
Type
似乎包含冗余数据,应该删除,除非你在 Type
和 Warehouse
and/or 之间存在 many-to-many
关系 Item
。在这种情况下,您需要在 Type
和 Warehouse
或 Item
之间引入 bridge-entity
(又名 composite entry
)以创建两个 1-to-many
关系.
- 最后,如果我没看错的话,
WarehouseItem
似乎是 Warehouse
和 Item
之间的 bridge-entity 来分解 many-to-many
他们之间的关系。如果这是正确的,假设 Warehouse
和 Item
的组合代表一个 composite key
,你应该能够证明这个 table 是 3NF。
所以假设我正确地解释了你的模式,一旦你消除了冗余 Type
table,那么是的,我会说这个设置在技术上符合 3NF。请注意,您的要求
given that a Warehouse only holds Items with of specific Type
可能需要您引入一个新的 type 字段,这意味着您需要重新评估 table 的规范化。如果您有两种不同的类型(WarehouseType
和 ItemType
),那么您可能需要保留 Type
table 并将其转换为这两个新字段之间的映射 table。但我需要查看数据示例才能更好地进行评估。
假设有仓库,每个仓库存储特定类型的物品。
所以有带字段的表
- 仓库 - ID、名称、类型
- 项目 - ID、名称、类型
- WarehouseItem - 仓库,项目
- 类型 - ID、姓名
问题是 - 鉴于仓库仅保存具有特定类型的项目,这违反了什么数据库规范化规则?
这个数据库规范化了吗?
(问题的例子是编出来的,但是我在现实生活中基本都有这个问题。)
我只是在没有任何数据示例的情况下查看您的元数据而做出一些假设,但乍一看,您的模式似乎大部分都已规范化。从技术上讲,如果满足以下所有标准,您的 table 就是 3NF(这应该是您的目标):
- 也是1NF - 每个条目只包含原子数据(或单条信息)
- 也是2NF - No candidate key dependency meaning that when you have have a composite primary key(由多列组成的key)所有数据都依赖于整个key
- 它是 3NF - No transitive dependency meaning all data is only dependent on the primary key 而不是 table 中的其他列
请注意,也有更高的规范化形式,但它们大多是学术性的,因为您开始经历性能下降,您规范化得越多
给定这个定义:
Warehouse
出现3NF假设每个仓库只能有一个Type
。如果不是,那么您将无法通过传递依赖,并且需要将Type
信息移动到新的 table.Item
也出现 3NF 假设只能分配一个Type
Type
似乎包含冗余数据,应该删除,除非你在Type
和Warehouse
and/or 之间存在many-to-many
关系Item
。在这种情况下,您需要在Type
和Warehouse
或Item
之间引入bridge-entity
(又名composite entry
)以创建两个1-to-many
关系.- 最后,如果我没看错的话,
WarehouseItem
似乎是Warehouse
和Item
之间的 bridge-entity 来分解many-to-many
他们之间的关系。如果这是正确的,假设Warehouse
和Item
的组合代表一个composite key
,你应该能够证明这个 table 是 3NF。
所以假设我正确地解释了你的模式,一旦你消除了冗余 Type
table,那么是的,我会说这个设置在技术上符合 3NF。请注意,您的要求
given that a Warehouse only holds Items with of specific Type
可能需要您引入一个新的 type 字段,这意味着您需要重新评估 table 的规范化。如果您有两种不同的类型(WarehouseType
和 ItemType
),那么您可能需要保留 Type
table 并将其转换为这两个新字段之间的映射 table。但我需要查看数据示例才能更好地进行评估。