2009-09-14 40 views
4

我正在实现一个基于Web的应用程序,使用silverlight和后台的SQL Server数据库,用于应用程序将显示的所有数据。我想确保应用程序可以轻松扩展,并且我认为应用的方向是使数据库松散耦合,而不是将所有内容与外键绑定在一起。我试过寻找一些例子,但无济于事。松耦合数据库设计 - 如何?

有没有人有任何信息或良好的起点/样本/例子,以帮助我摆脱这个困境?

非常感谢。

亲切的问候,

+1

记住这句俗话:**他谁与外键跳过数据库,将跳过数据完整性数据库** – 2009-09-14 14:11:43

回答

2

除非你在一个时间执行插入大量的,就像一个数据仓库,使用外键Normalization比例疯狂,你应该利用这一点。外键速度很快,如果您一次插入数百万条记录,约束条件只会让您失望。

确保您使用的是具有聚簇索引的整数键。这应该使联接表非常迅速。你可以在没有外键的情况下解决问题,这很令人沮丧。我只是花了整个周末这样做,而且我们有意识地选择不使用外键(尽管我们有TB数据)。

+0

题外话:我可以问你的意见在一个表使用GUID的一个ID字段?我相信这会减慢数据的检索速度,但我被告知否则....使用自动增量Int字段的ID列有什么问题? – Goober 2009-09-14 12:02:44

+1

什么都没有。它和任何GUID一样好(小于16字节)。除非你希望有更多的行比int可以处理更多的行(2^32或大约40亿),否则autoincrementing int主键可以正常工作。 – ConcernedOfTunbridgeWells 2009-09-14 12:07:13

+2

@Goober:如果您要加入两个或更多的表格,使用主键的GUID将会减慢检索的速度,但它不会慢于数量级(查询将花费大约一倍的时间这种方式),并且它不会影响单个表上的简单SELECT。但是,自动增量int列作为主键没有任何问题。 GUID PK最适合分布式/复制数据库。 – MusiGenesis 2009-09-14 12:08:19

8

我认为你会混淆你的术语。 “松散耦合”指的是让软件组件彼此不相互依赖,以至于它们不能在同一个程序中一起运行或甚至编译而不需要编译。我从来没有见过用来描述同一个数据库中表之间关系的术语。

我认为,如果您搜索条件“规范化”和“反规范化”,你会得到更好的结果。

1

在您甚至想到这样的事情之前,您需要考虑数据完整性。存在外键,因此如果它们所基于的主数据不存在,则无法将记录放入表中。如果你不使用外键,你会迟早(可能更早)结束无价值的数据,因为你不知道客户是谁,例如订单。外键是数据保护,你不应该考虑不使用它们。

即使您认为您的所有数据都来自您的应用程序,但在现实生活中,这是不正确的。数据从查询窗口中的多个应用程序(从进口大量数据)中进入(请考虑何时有人决定从用户界面一次更新一次不会执行的所有价格)。数据可以从多个来源进入数据库,并且必须在数据库级别进行保护。少做就是让整个应用程序和数据处于危险之中。

0

当通过数据库脚本等外部数据源输入数据时,对数据库安全性发表评论。