关于空间占用的MS SQL数据库结构

时间:2017-02-13 21:19:39

标签: sql-server database database-design relational-database

我在MS SQL中创建一个数据库。

对于长期数据库空间占用和性能问题有疑问。

我有一个用户表可以有不同类型的元值。

Table_User
PK UserID

Table_User_Meta
PK UserMetaID int
FK UserID int
FK CreatedBy int
   CreateDate Datetime
   TextValue varchar(500) NULL
   DecimalValue decimal(18,0) NULL

对于不同的用法,用户可能具有不同类型的元值,因此TextValue或DecimalValue将为null。 由于TextValue最多可以为500,当有数百万行只有十进制值时会占用太多空间吗?

我想到了另一种方法。

Table_User
PK UserID

Table_User_Meta_Text
PK UserMetaTextID int
FK UserID int
FK CreatedBy int
   CreateDate Datetime
   MetaDescription varchar(500)

Table_User_Meta_Decimal
PK UserMetaTextID int
FK UserID int
FK CreatedBy int
   CreateDate Datetime
   DecimalValue decimal(18,0)

这样我使用两个单独的表,没有空字段。 但是一旦我需要检索数据,这种方式将迫使我读取两个表。

我的问题是哪种方式会更好?对于空间使用和长期性能。 Table_User中可能至少有1亿用户,每个用户最多可以有两个Meta,无论是文本还是十进制。

谢谢大家!

编辑:

解释可能重复的问题:

谢谢你们回答我的问题,我认为我的问题与此问题不一样SQL Server 2008, how much space does this occupy?

我的问题更多的是哪种方式是平衡空间占用和读/写性能的好方法。因为我从未处理过包含大量数据的数据库,所以我不确定哪种方式更适合实现。

下面的答案仍然有帮助,所以我会考虑更多的I / O性能而不是空间占用。谢谢你们。

1 个答案:

答案 0 :(得分:0)

  • 首先,VARCHAR数据类型不存储不必要的空格, 除非你指定这样的内容:ABC DEF。所以不要 在这种情况下担心空间。
  • 第二,如果您担心空间,请使用BIGINT而不是。{ decimal(18,0)并且不要担心NULL,这可能会节省你的时间 很多空间。