SQL表设计问题

时间:2011-01-30 05:19:24

标签: sql sql-server tsql

如果这听起来很愚蠢,请忽略这个问题。

我有用于相册的SQL表(SQL Server),它有20多个列&它将拥有数百万张专辑。

我需要将一些专辑指定为Promoted,将一些专辑指定为每周精选。 当我向用户展示时,我还需要一种非常有效的方式来获取这些专辑(逐页)。

我该如何设计呢?

选项1:  我可以创建另一个表来存储像这样的提升和特色专辑的ID,然后加入主专辑表来获取我需要的列。

table specified_albums:

album_id  promoted_featured
    1         1
    5         0
    7         1
    15        0

提升的查询将返回1,7 要素的查询将返回5,15

选项2:  如果提升,我可以添加1列存储1,如果有特色,我可以添加0否则为空  然后,我可以查询该列中的1以查看促销相册& 0为特色。

选项3:  我可以添加2位列:一列用于提升(0/1),一列用于特色(0/1)

哪种方式表现更好?

修改: 该设计在SQL 2008中也应该是高效的。现在我有SQL 2005。

4 个答案:

答案 0 :(得分:3)

如果宣传和/或推荐的专辑是“所有”专辑的一小部分,那么您应该将它们放在单独的表格中。

如果宣传的和/或推荐的专辑占整体设置的很大一部分,那么如果您将列添加到现有表格中,效果会更好。

我将承担第一个案件;你有'数百万'的专辑,而且我相信你不会推广或展示超过几千张专辑,绝对不会成千上万。这个小得多的表中的查找速度非常快,并且只要“主”表聚集在主键上,连接也会很快。

答案 1 :(得分:3)

您提到了到SQL 2008的挂起迁移。在该版本中添加了已过滤的索引。许多“使用不同的表”与快速数据访问有关。通过使用过滤索引,您可以充分利用这两个世界(即,在仍然能够查询小表的同时,将各种状态存储在您的数据中)。当您能够将SQL 2008用作平台时,可能值得探索

答案 2 :(得分:2)

创建另一个表。一个小表快速查询。用你的主表加入PK也会很快。此外,当(无论是否知道)需求发生变化时,很容易修改小表。

考虑主表的额外列中有多少值未使用,只存储相同的“非活动”值。表行越大,访问整个表的速度就越慢。

答案 3 :(得分:0)

我会创建一个名为Status的主表,它将包含以下列。

Status_tb

status_id status_name
0         None
1         Feautured
2         Promoted
3         Both

注意:两者都意味着提升和特色。

现在在相册事务表中,我将添加一个名为status_id的列。这将有一个fk引用主表。

这很干净而且效率很高。 (高度倾斜的列,因此也有助于直方图和分区)