2

我正在开发一个多语言 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,但这看起来很愚蠢。

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

4

2 回答 2

0

Paul 对 SEQUENCES 的建议是正确的。

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

当您添加现有类别的新语言时,您将调用现有的 CategoryId 以重新使用。UNIQUE KEY (CategoryId, LangaugeId) 也建议避免粗心的错误。

于 2012-10-16T09:26:12.257 回答
0

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

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

declare @CategoryID int;
update config set @CategoryID = CategoryID = CategoryID + 1;
于 2012-10-16T09:20:44.150 回答