sql-server - 在数据库的引用表中记录代表 "all other records"的记录是个好主意吗?

标签 sql-server asp.net-mvc database database-design database-schema

我有一个带有 SQL Server 后端的 asp.net-mvc 网站。我正在简化我的情况以突出和隔离问题。我在数据库中有 3 个表

  1. 文章表(id、名称、内容)
  2. 位置表(id,name)
  3. ArticleLocation 表(id​​,文章Id,位置Id)

在我的网站上,当您创建一篇文章时,您可以从多选列表框中选择您希望将该文章发送到的位置。

大约有 25 个位置,所以我正在考虑添加一个名为“全局”的新位置作为快捷方式,而不是让用户从列表框中选择 25 个不同的项目。我仍然可以将此作为前端的捷径来执行,但现在我正在讨论将其流向后端是否有好处。

因此,如果我有一篇全局性的文章,而不是在 ArticleLocation 表中有 25 条记录,我只会有一条,然后我会在前端做一些技巧来选择所有项目。我想弄清楚这是否是一个非常糟糕的主意。

我能想到的事情让我感到紧张:

  1. 如果我创建了一篇文章并选择了全局,但后来最后添加了 3 个新位置,该怎么办?如果没有这个全局设置,这 3 个位置将不会获得文章,但以新的方式,它们会。我不确定哪个更好,因为第二件事实际上可能是您想要的,但不太明确。

  2. 我有一个报告要求,我想按所有全局文章进行过滤。想象一下,我需要一个 article.IsGlobal() 方法。现在我想我可以说,如果一个项目具有与位置表中所有记录相同的位置数,我可以将其转换为被视为全局性但再次因为人们可以添加新位置,我觉得这种方法有点不稳定.

对于在真正反射(reflect)“所有记录”的引用数据表中创建记录的困境,有人有什么建议吗?感谢任何建议

最佳答案

应要求,这是我的评论提升为答案。这也是一个扩展它的机会。

我将把我的回答限制在一个只有一个位置列表的系统上。我做过公司层次结构的事情:公司、部门、地区、州、县、办公室和员工等等。它变得丑陋。

就 OP 的问题而言,似乎在 Articles 表中添加一个 AllLocations 位可以使意图明确。标志设置为 1 的任何文章都会出现​​在所有位置,无论它们是何时创建的,并且不需要在 ArticleLocation 表中有任何条目。如果作者不希望某篇文章自动出现在未来的位置,则仍可以将其明确添加到所有现有位置。

实现涉及更多的工作。我会将 INSERTUPDATE 触发器添加到 ArticleArticleLocation 表以强制执行 AllLocations 位已设置且 ArticleLocation 中没有相应的行,或者该位已清除且位置可能已明确设置。 (个人偏好让数据库在可行的情况下保护自己免受“坏数据”的侵害。)

根据您的需要,表值函数是隐藏一些脏工作的好方法,例如dbo.GetArticleIdsForLocation( LocationId ) 可以在内部处理 AllLocations 标志。您可以在存储过程和临时查询中使用它,以通过 ArticleJOIN。在其他情况下, View 可能是合适的。

欢迎您借用的另一个功能(“从您的 friend 那里窃取!”)是让管理员的登录页面成为“异常(exception)”页面。在这里,我展示了从大规模的燃烧性灾难到纯粹的过失。在这种情况下,与零个位置相关联的文章将被视为不重要但值得检查的文章。

添加新位置的人可能会对在每个位置明确显示的文章感兴趣,因此我可能会为此创建一个网页。可能某些文章应该更新以明确说明新位置,或者重新考虑更改为所有位置。

关于sql-server - 在数据库的引用表中记录代表 "all other records"的记录是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16886359/

相关文章:

c# - 我如何将值传递给 Controller

sql-server - SQLSERVER : BCP import and encrypt columns using Database Key

database - PostgreSQL 9.3 中 b/w pg_basebackup 和 TAR 备份(停止/启动)备份的区别?

MySQL |如何使用正则表达式显示列?

sql-server - 通过 unixODBC 和 FreeTDS 从 MSSQL 返回西里尔符号的问题

mysql - 截断表后 PostgreSQL 错误 22012 除以零

sql-server - 在SSRS中自动设置用户的订阅

SQL逆透视多列数据

javascript - 使用 Razor 参数进行 JQuery Post Ajax 调用

c# - 在 MVC 5 中填充 DropDownList