Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-非规范化_Sql_Sql Server - Fatal编程技术网

SQL-非规范化

SQL-非规范化,sql,sql-server,Sql,Sql Server,我正在尝试熟悉一个新的数据库,其结构如下: CREATE TABLE [TableA] (ID int not null, Primary Key (ID)) CREATE TABLE [TableB] (ID int not null, Primary Key (ID)) CREATE TABLE [TableC] (ID int not null, ID2 int, ID3 int, ID4 int, primary key (ID), FOREIGN KEY (ID2) REFERENCE

我正在尝试熟悉一个新的数据库,其结构如下:

CREATE TABLE [TableA] (ID int not null, Primary Key (ID))
CREATE TABLE [TableB] (ID int not null, Primary Key (ID))
CREATE TABLE [TableC] (ID int not null, ID2 int, ID3 int, ID4 int, primary key (ID),
FOREIGN KEY (ID2) REFERENCES TableA(ID), FOREIGN KEY (ID3) REFERENCES TableB(ID))

表C是表a和表B之间的多对多连接表。TableC.ID是唯一的(因为它是主键)。表C.ID4也是唯一的,似乎没有提及任何内容。我联系了开发人员,他将其描述为“M1(多对1)实体的非规范化”。我完全理解去规范化的目的(规范化数据库,然后出于性能原因故意引入异常),但是我仍然不理解这背后的原因。是否有我不知道的模式或概念?应用程序是用C++编写的,有一点VB .net .< /p> ,如果表ID4包含通常必须执行附加连接或查找的值,则是公平的非正规化。那么,您是否检查了应用程序代码以查看填充该列的目的?如果它没有引用任何内容,也没有对整个行数据进行任何充实,您可以安全地继续开发。

这本身不是一个答案,只是一个相关的想法。请不要投票反对它


tableC.ID和tableC.ID4之间有什么联系吗?在我的一个项目中,我遇到了类似的情况——在用户表中有userid和username。两者都是唯一的,以userid作为主键。有一种方法可以从该表中删除username,并创建一个单独的表,将userid映射到username。我不太喜欢正常化。所以我认为每当我需要从包含用户名的用户表中获取数据并保持我的设计不变时,启动联接查询是一种开销。

他称之为“非规范化”?这类表(
table c
)通常用作多对多关系之间的交叉引用,而不是多对一关系(通常使用子表中的简单FK解决)
TableC.id
是无意义的,假设元组[
TableC.id1
TableC.id2
]是唯一的(然后是主键)。如果
table c.id4
没有任何相关数据,则应将其删除(不要提前添加“未使用的”属性,YAGNI)。也许我们可以得到更多的信息?你能建议这个领域可以用来做什么吗?我本以为主键足够了,因为它是唯一的。建议您使用该列做什么?不,我不能。我在这里所说的一切都是纯粹的假设:可能ID4字段实际上是对同一模式中另一个表中另一个pk的引用,prev dev只是决定不对列施加外键约束。我认为您应该问上一个开发人员的问题是ID4引用的表/实体到底是什么。或者,如果您可以从该特定表的应用程序插入代码返回,并发现用于填充该字段的内容。根据他给您的解释,该列刚刚引入,因此他不必去其他地方查找该特定值。所以他必须告诉你“其他地方”在哪里如果这不是一个答案,你为什么不发表评论?这可能不是一个完美的答案。