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