添加一个只有一列的表(一个自动递增的标识)是一个好主意吗?

时间:2012-10-16 09:16:01

标签: sql sql-server-2008 database-design localization

我正在开发一个多语言Web应用程序,我在确定处理数据库中特定方案(SQL Server 2008)的最佳方法时遇到了一些困难。

假设用户可以添加帖子。帖子有默认数据和本地化数据。帖子也只与一个类别相关联。用户还可以管理这些本地化类别。

关于帖子的部分对我来说非常清楚。这将是这样的:

Posts
-----
PostId (auto incremented identity)
CategoryId
CreationDate
SortOrder

PostLocalizations
-----------------
PostId
LanguageId
Title
Content

我遇到的问题是类别没有默认数据。这只是一个文本描述,我不确定什么是存储本地化的最佳方式。

我可以想到一个可能的解决方案,但我并不喜欢它。

Categories
----------
CategoryId (auto incremented identity)

CategoryLocalizations
---------------------
CategoryId
LanguageId
Name

我不喜欢只有一列的表:自动增加的身份。当然我可以添加我不需要像CreationDate或SortOrder那样的虚拟字段,但这看起来很傻。

有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:0)

在纯粹的关系设计中,这里的类别是属性而不是实体。表是实体,列是属性。你真正说的是CategoryLocalizations实体实例有一个类似的“类别”,就像一组书在封面上有类似的“颜色”一样。除了颜色是有限的,并且不断地组成类别(因此身份)。

这个差距早已被确定并最终插入SQL Server 2012.然而,在SQL Server 2008中,IDENTITY通常是高容量事务表的强大工具。 但是,因为你的表看起来体积非常小,我会简单地将其添加为我的配置或通用设置表中的字段,并在我不经常需要值时进行更新,例如

declare @CategoryID int;
update config set @CategoryID = CategoryID = CategoryID + 1;

答案 1 :(得分:0)

保罗对SEQUENCES的建议是正确的。

当您要在表格中插入新的类别时,一种愚蠢的方式是使用事务(+存储过程)并获得MAX(CategoryId)+1作为新ID。

当您添加现有类别的新语言时,您将回想起要重复使用的现有CategoryId。还建议使用UNIQUE KEY(CategoryId,LangaugeId)来避免不小心的错误。