数据库设计更大的表vs拆分表有相同的col

时间:2012-01-22 18:02:45

标签: nhibernate database-design orm relational-database

我有一个商店的数据库程序,因为你知道有一种类型的发票,其中一个用于我买的东西,另一个对我来说,当我卖掉它们时,两个表几乎相同,如

发票表 ID 顾客姓名 日期 invoiceType

和invoiceDetails有 ID invoiceId 项目 价钱 量

我的问题很简单,它最好保留这样的设计,或者将每个表分成两个表格 我朋友的一对夫妇建议将桌子分成一个用于销售的发票,另一个用于buyInvoice,以加快查询的时间 所以,如果我把它们分开就像我不遵循干燥规则那样,那么每个人都会感到赞成 我正在使用Nhibernate BTW所以它的种类很奇怪,必须使用不同名称的相同类

2 个答案:

答案 0 :(得分:1)

接近两者都会奏效。如果使用单表方法,则invoiceType列将是您的鉴别符字段。在你的nHibernate映射中,nHibernate将使用这个鉴别器字段来决定实例化表中给定行的类型(即购买或销售)(参见nHibernate mapping guide的第5.1.6节。)临时SQL查询或报告查询,您可以创建两个视图,一个只返回invoiceType = purchase的行,另一个只返回invoiceType = sales的行。

或者,您可以创建两个单独的表,一个用于购买,另一个用于销售。正如您所指出的,这两个表将具有几乎相同的模式和nhibernate映射文件。

如果您预计交易量非常高,您可能希望将购买和销售放在两个不同的物理光盘上。使用两个不同的表,可以通过将它们放入不同的文件组来完成。使用单个表格,您仍然可以通过创建SQL Server Partitioned Table来实现此目的。在您遇到这个问题之前,您可能想要评估这是否真的是必要的,并且对表的磁盘访问确实会成为性能瓶颈。如果没有必要,您不希望花费大量时间进行过早优化。

我的偏好是拥有一个带有鉴别器列的表,以更好地遵循DRY原则。除非我有坚实的数字表示有必要,否则我会推迟实施分区表,直到有必要为止。

答案 1 :(得分:1)

我问自己,我打算如何使用这些信息?我是否需要在同一查询中销售和购买发票?对于每种类型,我最终可能需要专门的信息(很可能是我的经验)?如果我这样做,我需要只有1种类型的子表吗?这会如何影响参考完整性?改为1会自动意味着我需要改变另一个吗?该表可能有多大(在考虑可能需要仅因大小而被拆分之前,它必须是数百万)。如果他们在同一张桌子中并且在我不想要的时候包含这两种信息,那么我是否有可能将这些信息意外混淆?答案将决定我是否需要将它拆分出来。我倾向于将这些视为两个独立的功能,并且需要很多说服我将它们放在一个表中。