mysql - 我怎样才能抽象出或删除这种依赖

标签 mysql database normalization

我有一个 3nf 数据库。其中有一系列的两个表,它们是更大的依赖链的一部分。这两个表(A 和 B)给我带来了关于强制参照完整性的问题。

Table A
int AId //primary key
string Name
date Date
int BId //foreign key

Table B
int BId //primary key
string Name
string Description
int CId //foreign key

Table C
int CId
string HowTo

这些表格只是部分示例,请参阅下面的说明:

表 C 包含如何制作 FooBar 的信息。制作 FooBar 时,表 B 记录了制作 FooBar 的实际方式,用于跟踪和 QA 目的。一旦创建了 FooBar,并且在表 B 中填写了其创建方式的数据,表 A 将通过外键 BId 保存一个新的 FooBar 以及来自表 B 的信息。

我的问题是,有时作为异常情况,FooBar 需要能够进入系统而无需(基本上作为导入)。但是,由于设计不佳,如果没有(在此示例中)表 B 中的相关条目以确保表 A 中的外键有效且不破坏参照完整性,这是不可能的。

我考虑采用的方法是在 A 和 B 之间放置另一张 table 。

Table AB
int ABId //primary key
int BId //foreign key
int AId //foreign key

原因是可以从表 B 中的一个条目创建多个 FooBar,这意味着此更改可能导致:

Table AB

ABId  BId  AId
1     2    6
2     2    7
3     2    8
4     3    9
5     3    10

A) 是否有不同的方法我应该使用它来消除这种依赖性,以便可以将记录添加到表 A 而无需满足表 B 中的外部记录?

B) 进行建议的更改是否会减慢查询速度?

最佳答案

只需让 A.BId 能够包含 NULL,并将其设置为 B-less A 的那个。 NULL 不参与外键。

关于mysql - 我怎样才能抽象出或删除这种依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11214838/

相关文章:

mysql - 将表索引从 Int 转换为 Bigint MySQL

sql-server - 使用 SQL Server 2000 表作为工作队列时,有哪些方法可以编写可伸缩服务?

mysql - 我是否正确规范了这张表?

javascript - 规范化性能 : allIds array vs Object. 条目函数

php - mysql连接不工作

mysql - SQL从特定日期范围开始进行不同计数?

sql-server - 数据库设计 : preferred field length for file paths

MySQL SELECT 语句,其中请求参数的字符多于数据库中的内容

database - SQLite3 数据库中的派生字段

javascript - 无法根据连接表字段对 sequelize 结果进行排序