Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Database design 这是正确的数据设计吗_Database Design_Relational Database_Database Normalization - Fatal编程技术网

Database design 这是正确的数据设计吗

Database design 这是正确的数据设计吗,database-design,relational-database,database-normalization,Database Design,Relational Database,Database Normalization,我负责一个遗留系统,里面有一个遗留数据库。 它以一种对我来说很奇怪的方式对数据进行了建模,例如,看看这个通用表: nr jdptype jdpid jdpdescr ----------- ---------- ----------- -------------------------------------------------- 1 jrelation 1 Leverancier 2 jrel

我负责一个遗留系统,里面有一个遗留数据库。 它以一种对我来说很奇怪的方式对数据进行了建模,例如,看看这个通用表:

nr          jdptype    jdpid       jdpdescr
----------- ---------- ----------- --------------------------------------------------
1           jrelation  1           Leverancier
2           jrelation  2           Klant
3           jrelation  3           Dealer
4           jcontact   1           Contact
5           jaddress   1           Hoofdadres
6           jcomm      1           Phone
7           jcomm      2           Fax
8           jcomm      3           Email
9           jcomm      4           Internet
10          jcomm      5           Mobile
11          jfunction  2           Eigenaar
13          jfunction  4           Medewerker
14          jfunction  5           Ontwerper
15          jcountry   2           België
16          jcountry   3           Duitsland
17          jcountry   4           Nederland
18          jcountry   5           Engeland
19          jcountry   6           Frankrijk
20          jfunction  1           Ontw. Verk.
21          jlanguage  2           Nederlands
35          jtitle     2           Juff.
36          jaddress   4           Leveradres
38          jtitle     3           Dhr
39          jcountry   7           China
41          jaddress   5           Filiaal
42          jrelation  4           Architect
43          jrelation  5           Aannemer
44          jlanguage  3           Frans
45          jlanguage  4           Duits
46          jfiliaal   2           FrWe
47          jfiliaal   3           FrZo
48          jfiliaal   4           BoTu
49          jtitle     4           Prof
50          jtitle     5           Prof.
52          jtitle     7           Ing.
53          jtitle     8           Mr.
54          jtitle     9           Mevr.
55          jtitle     10          Dhr. Ing.
56          jtitle     11          Dhr. Ir.
57          jtitle     12          Mevr. Ing.
58          jtitle     13          Mevr. Ir
59          jtitle     14          Dhr. & Mevr.
60          jtitle     15          M. et Mme.
61          jtitle     16          Mlle
62          jtitle     17          Mme.
64          jrepres    3           J. Van Genechten
70          jrepres    9           R. Verschueren
75          jrepres    14          D. Verschueren
77          jrepres    15          Geen
78          jfunction  6           Verkoper
79          jfunction  7           Medew. Verk.
80          jfunction  8           Vertegenwoordiger
82          jrepres    17          S. Van Onckelen
83          jrepres    18          L. Jacobs
84          jrepres    19          R. Schoeters
85          jrepres    20          L. Delen
86          jrepres    21          B. Bouvé
87          jrepres    22          P. Van Haute
88          jfiliaal   1           MeMe
89          jrepres    16          E. Heykants
90          jfiliaal   5           Arro
91          jfiliaal   6           OfZo
nr是主键,但实际上对我来说,这看起来像是几个表被放在一起。 我的直觉是创建一个relationtype表、一个communicationtype表、一个country表等等

它违反了当前状态下的规范化规则,因为jpddescr实际上与nr无关,而是与jdptype和jdpid的组合有关

我的假设是正确的吗?我是否应该考虑把它重构成一个适当的设计,或者我缺少什么东西有利于这种“通用”的设计?


我在尝试创建实体图时偶然发现了这一点。一直必须创建此表的导航属性,例如没有任何东西可以阻止您填写函数id的关系,这真的很烦人。

这看起来确实很奇怪,但正确的修复需要对用例有更深入的了解

我认为创建许多表有其自身的缺点,特别是在这种情况下,不会是一对一的替换,因为当前的实现对于可能的类型是灵活的(它的无限表与一组恒定的表)


我会用链接到
jdptypes
表的外键替换
jdptypes
,以改进设计和性能。

作为一个域,它实际上是一个和类型/标记的并集,也就是一个真正的查找表。希望在(jdptype,jdpid)上至少声明了一个唯一的约束。您正确地指出,它包含一个可传递的依赖项,因此存在更新异常的风险。然而,我不太关心这一点,而是更关心这样一个事实:任何读取与此表相关的数据的代码都不知道应该使用哪个域。如果我询问,我会得到地址、头衔、国家、语言、电话号码或其他信息吗?它可能是一种混合,所以我必须逐个处理每一行,而不是一次处理整组。由于每个模块的查找表都很可能被卷进这个表中,因此案例逻辑可能会在许多地方重复,因此它也可能在代码中无处不在。更重要的是,为特定类型的值向数据库添加新属性有点困难,例如电话号码的国际拨号代码或ISO 2位代码或国家/地区的邻居。想建立一个由关键字和语言键控的本地化表吗?注意,你的翻译可能取决于电话号码而不是语言。克服这些问题的最简单方法是开始为每种类型添加新表,这违背了将所有内容都放在一个表中的最初目的。其他的可以通过检查约束来克服,如果DBMS支持的话,检查约束将比等价的外键约束更复杂、效率更低

为了重构它,我将为每种类型的行子集创建一个视图,可能会与任何一个将一对一映射到这些行的附加表连接起来。然后通过系统重写对基表的任何引用。然后,我可以分解基表并用单独的表替换视图,最后创建必要的外键约束以强制引用完整性。但是,在您开始任何重构之前,我建议您检查现有数据,以验证您关于数据正确性的假设事实上成立。通常,任何可以记录的东西都会被记录下来