2012-02-28 54 views
2

我有一个asp.net应用程序,使用大量主数据,如货币,国家,城市和许多其他领域特定的主数据。当前数据库模型对于每种类型的主数据都有一个主表。例如,各个国家/地区都有一个带有ID和值列的独立主数据表。对所有其他主数据进行类似。这是管理主数据的正确方法吗?我愿意彻底改变它。我想对此发表意见。还有什么文章或书籍可以为我在db建模中的这些场景做好准备吗?主数据表设计

+0

我不知道我明白。你说你有一张像国家,货币,城市等的表格,而且它们基本上只是键值对,对吧? – 2012-02-28 15:11:32

+0

@MattGrande。是啊,没错。他们大多用来填充前端的下拉列表。 – 2012-02-28 15:13:58

+2

我会说那很好。继续这样做! – 2012-02-28 15:15:03

回答

1

在关系设计和数据建模中,没有“主”数据这样的事情,也没有“主”表这样的事情。只有数据和表格。

因此,如果您需要存储某些有关国家/地区的数据,即使它们只是其名称,然后创建一个国家/地区表。不过,不要使用身份证号码。使用ISO country code。这是人类可读的(大部分),而不需要连接。并确保名称上有一个唯一的约束,而不仅仅是代码。如果你可以有两个国家命名为“爱尔兰”,你就犯了一个错误。

仔细考虑应该允许谁在该表中插入,更新和删除行。 “每个人”几乎肯定是错误的答案。

当其他表需要存储现有国家/地区的代码时,这些表会为国家/地区表声明外键。

如果你正在谈论一个看起来像这样的“主”表。 。 。

ID Name 
-- 
1  England 
2  London 
3  Birmingham 
4  Liverpool 
5  British Pound (sterling) 
6  Republic of Ireland 
7  Aughagower 
8  Ballyshannon 
9  Euro 

然后,你正在创造更多的问题,有更多的表比你感到舒服。这种反模式的通用名称是“The One True Lookup Table”。

首先,外键在这里没用,因为没有办法向用户展示有效的国家,城市或货币可供选择的列表。如果用户简单地从该表中选择值,英格兰伦敦的用户可能会输入“Eury,Aughagower”。

其次,这是一个事实上不正确的模型。 “伦敦”不是指定城市的名称;尽管如此,“伦敦,英国,英国”,“伦敦,加拿大安大略省”和“伦敦,肯塔基州,美国”都是。如果您的数据库允许名为“美国阿拉巴马州旧金山”的“城市”,那么您的工作就没有做好。

第三,该模型不是干净可扩展的。货币本身比他们的名字有更多有用的属性。旧英镑有象征,英镑和ISO代码GBP。我记不起任何在过去30年中使用货币名称而不是其符号或ISO代码的报告。

最后,正确模拟数据不会“污染”数据库,也没有“迷你表”这样的东西。对数据进行建模可以简化您的工作,并简化应用程序代码。当你建立一个适当的关系模型时,每个表格将存储一种且仅有的一种事实。如果您遇到问题,您将确切知道在哪里寻找 - SQL错误消息几乎总是将导致问题的表命名为名称。排除国家表格的问题比使用存储50个或更多不同类型事实的“主”表格更容易。

如果表的数量不堪重负,请考虑将其中的一些放在不同的模式中。随着您获得经验,处理大量名字明确的表将成为第二性质,并且您将学会忽略与您的即时任务无关的表。

+0

我看到很多使用Master Data Table(一个存放那些只有“ID”和“Name”属性的实体的大表)的生产软件。我发现这个设计很麻烦,但是另一个选项用几个迷你表来监控数据库方案。那么...... Master Data是一个糟糕的设计实践? – 2012-02-28 22:09:48

+0

@CarlosGavidia:是的,“主”表是一个糟糕的设计实践。看到我更新的答案。 – 2012-02-29 12:36:25

2

为查找数据的每个种类提供单独的表格是合理的。这允许正确执行参照完整性。

E.g. COUNTRY_ID字段(在某些“非查找”表中)有一个FOREIGN KEY引用COUNTRY表,CURRENCY_ID引用CURRENCY表等......每个字段引用适合该特定字段的表。