我正在开发一个多语言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那样的虚拟字段,但这看起来很傻。
有没有更好的方法来解决这个问题?
答案 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)来避免不小心的错误。