基本问题:如何正确地重新设计此架构

时间:2011-02-23 17:59:52

标签: sql database-design normalization

我正在跳过一个位于Sql Server 2008数据库之上的项目,对我来说这似乎是一个低效的架构。但是,我不是SQL的专家,所以我正在寻求指导。

通常,架构具有如下表格:

ID | A |乙

  • ID是唯一标识符
  • A包含文本,例如动物名称。品种很少;数千行中可能有3-4个不同的值。这可能会随着时间而变化,但仍然很小。
  • B是两个选项之一,但存储为文本。该集是有限的。

我的问题如下:

  • 我是否应该为包含在A中的名称创建另一个表,其中包含ID和值,并将ID设置为主键?或者我应该在我的表中的那一列上放一个索引?现在,要获得A的列表,它确实“从表中选择不同的(a)”,这对我来说似乎效率低下。
  • 该表有多个A列属性列。它可能是:颜色,年龄,重量等。我认为这更适合在单独的表中使用:ID,AnimalID,Property,Value。每个属性对于动物都是唯一的,所以我不确定这个模式如何强制执行此操作(当前模式暗示这是一个列,因此每个属性只能有一个值)。

现在数据库很容易被人类阅读,但它的大小正在快速增长,我觉得设计效率低下。目前在任何地方都没有索引。正如我所说,我不是专业人士,但会更多地了解这个主题。目标是建立一个快速的系统。谢谢你的建议!

2 个答案:

答案 0 :(得分:1)

与大多数事情一样,取决于它。

通过将动物名称直接放在表格中,通过消除对许多联接的需要,它可以提高报告查询的效率。

使用类似第3范式的形式(具有动物的ID /名称表)会使数据库变小,但需要更多联接才能进行报告。

无论哪种方式,请务必添加一些索引。

答案 1 :(得分:1)

这听起来像是一个可能代表兽医诊所的数据库。

如果您描述的表格代表了来到诊所的各种患者(动物),那么具有特定属性的表格可能在主要餐桌上最佳。但是,正如您所说的列“A”包含物种名称,将其链接到辅助表可能是值得的,以节省存储这些名称的冗余:

例如:

Patients
--------
ID  Name   SpeciesID   Color         DOB         Weight
1   Spot   1           Black/White   2008-01-01  20

Species
-------
ID   Species
1    Cocker Spaniel

如果您的主表应该由客户或所有者分组,那么您可能想要添加一个动物表并链接它:

Customers
---------
ID   Name
1    John Q. Sample

Animals
-------
ID   CustomerID   SpeciesID   Name    Color        DOB          Weight
1    1            1           Spot    Black/White  2008-01-01   20

...

对于原始列B,如果只需要存储两个状态,请考虑将其转换为布尔值(BIT)。除此之外,请考虑CHAR存储固定数量的字符。