高效的数据库表结构

时间:2012-02-17 09:42:19

标签: sql-server sql-server-2008 sql-server-2008r2-express

考虑Microsoft SQL Server 2008

我需要创建一个表,可以通过以下两种方式创建。

Structure Columnwise
StudentId number, Name Varchar, Age number, Subject varchar
eg.(1,'Dharmesh',23,'Science')
   (2,'David',21,'Maths')


Structure Rowwise
AttributeName varchar,AttributeValue varchar
eg.('StudentId','1'),('Name','Dharmesh'),('Age','23'),('Subject','Science')
   ('StudentId','2'),('Name','David'),('Age','21'),('Subject','Maths')

在第一种情况下,记录会更少,但在第二种情况下,它将会增加4倍,但会减少2列。

哪种方法在性能,磁盘存储和数据重审方面更好?

2 个答案:

答案 0 :(得分:4)

第一个会有更好的性能,磁盘存储和数据检索会更好。

  1. 将属性名称作为varchars将无法更改名称,数据类型或应用任何类型的验证
  2. 无法索引所需的搜索操作
  3. 将整数保存为varchars将使用更多空间
  4. 对整数进行排序,添加或求和将是一个令人头痛的问题,并且会有不良表现
  5. 使用此数据库的编程语言将无法拥有强类型数据
  6. 使用第一种方法的原因还有很多。

答案 1 :(得分:4)

您的第二种方法通常称为EAV设计 - 实体 - 属性 - 值。

恕我直言,第一次接近。这使您可以正确键入列,从而最有效地存储数据,并极大地帮助查询的轻松和高效。

根据我的经验,EAV方法通常会导致痛苦的世界。关于此问题的先前问题的Here's one example,与最佳做法有良好的联系。如果你进行搜索,你会发现更多 - 非常值得筛选。

人们沿着EAV路线前进的一个常见原因是为灵活的架构建模,这在RDBMS中相对难以有效地完成。其他方法包括在XML字段中存储数据。这是NOSQL(非关系型)数据库由于其无模式特性(例如MongoDB)而非常方便的一个原因。