【发布时间】:2013-05-28 23:47:19
【问题描述】:
我有一个带有 SQL Server 后端的 asp.net-mvc 网站。我正在简化我的情况以突出和隔离问题。我在数据库中有 3 个表
- 文章表(ID、名称、内容)
- 位置表(id、名称)
- ArticleLocation 表(id、文章 ID、位置 ID)
在我的网站上,当您创建一篇文章时,您可以从多选列表框中选择您希望将该文章发送到的位置。
大约有 25 个位置,因此我正在讨论添加一个名为“全局”的新位置作为快捷方式,而不是让人们从列表框中选择 25 个不同的项目。我仍然可以将其作为前端的快捷方式,但现在我正在争论是否有利于将其流向后端。
因此,如果我有一篇全球性的文章,而不是 ArticleLocation 表中的 25 条记录,我将只有一条,然后我会在前端做一些技巧来选择所有项目。我想弄清楚这是否是一个非常糟糕的主意。
我能想到的让我紧张的事情:
如果我创建了一篇文章并选择了全球,但后来最后添加了 3 个新位置,该怎么办。如果没有这个全局设置,这 3 个位置将无法获取文章,但以新的方式,它们会。我不确定什么更好,因为第二件事实际上可能是您想要的,但它不太明确。
我对报告有要求,我想按所有全局文章进行过滤。想象一下,我需要一个 article.IsGlobal() 方法。现在我想我可以说如果一个项目的位置数与位置表中的所有记录相同,我可以将其翻译为被认为是全球性的,但由于人们可以添加新位置,我觉得这种方法有点不稳定.
对于在真正反映“所有记录”的参考数据表中创建记录这一困境,是否有人有任何建议。感谢任何建议
【问题讨论】:
-
无论您选择哪种方式,您都将定义一个您可能不想要的要求:新位置是否会自动获取在该位置尚不存在时定义的文章。因此,如果您要使用全局标志,您似乎还应该添加一个关于它是否继承新位置的属性(或使其成为该位置的属性)。
-
在
Article表中添加AllLocations标志可能更清楚。标记设置为1的任何文章都会出现在所有位置,无论它们是何时创建的,并且不需要在ArticleLocation表中包含任何条目。如果作者不希望文章自动出现在未来的位置,则仍然可以将文章显式添加到所有现有位置。您可以隐藏视图背后的一些乐趣,并且可以添加一个触发器来强制执行一条规则,即一篇文章适用于任何地方或特定位置,但不能同时适用于两者。 -
保持简单,要么使用@HABO 的建议,要么按照您的第一直觉在位置表中添加“全球”记录。如果您出于各种原因开始创建快捷方式,我只会使用更高级的解决方案,即“欧洲”、“美洲”......等等。
-
我想知道为什么最复杂的答案得到了最多的支持 :) 似乎 SO 人们更喜欢复杂的技术重复而不是非常简单有效的解决方案 :-)
-
如果表格相对简单,我将允许在 ArticleLocation 中的 locationId 为空,而空条目将意味着它不依赖于位置,因此不依赖于全局。对我来说似乎也合乎逻辑。
标签: sql-server asp.net-mvc database database-design database-schema