>文章表(id,名称,内容)
>位置表(id,名称)
> ArticleLocation表(id,文章ID,位置ID)
在我的网站上,当您创建文章时,您可以从多选列表框中选择您希望该文章发送的位置.
大约有25个地点,所以我在辩论添加一个名为“全球”的新位置作为快捷方式,而不是让人从列表框中选择25个不同的项目.我仍然可以将其作为前端的快捷方式,但现在我正在辩论是否有利于此流程到后端.
因此,如果我有一篇全球性的文章,而不是在ArticleLocation表中有25条记录,我只会有一条,然后我会在前端做一些技巧来选择所有项目.我想弄清楚这是一个非常糟糕的主意.
我能想到的事情让我感到紧张:
>如果我创建一篇文章并选择全局但后来最后添加3个新位置会怎样.如果没有这种全局设置,这3个位置将无法获得文章,但是以新的方式,他们会.我不确定什么是更好的,因为第二件事实际上可能是你想要的,但它有点不那么明确.
>我对报告有要求,我想过滤所有全球文章.想象一下,我需要一篇文章.IsGlobal()方法.现在我想我可以说,如果一个项目的位置数与位置表中的所有记录相同,我可以将其转换为全局,但由于人们可以添加新的位置,我觉得这种方法有点不稳定.
有没有人对这个困境提出任何建议,围绕在真正反映“所有记录”的参考数据表中创建记录.感谢任何建议
解决方法
我将我的答案限制在一个只有一个位置列表的系统中.我做过公司层级的事情:公司,部门,地区,州,县,办事处和员工或其他一些人.它变得丑陋.
在OP的问题的情况下,似乎向Article表添加AllLocations位使得意图清楚.标志设置为1的任何文章都会出现在所有位置,无论它们何时创建,并且不需要在ArticleLocation表中包含任何条目.如果作者不希望文章自动显示在将来的位置,则仍可以将文章明确添加到所有现有位置.
实施涉及更多的工作.我会向Article和ArticleLocation表添加INSERT和UPDATE触发器,以强制执行AllLocations位设置且ArticleLocation中没有相应行的规则,或者该位是明确的,并且可以显式设置位置. (这是个人偏好让数据库在可行的情况下防御“坏数据”.)
根据您的需要,表值函数是隐藏一些脏工作的好方法,例如: dbo.GetArticleIdsForLocation(LocationId)可以在内部处理AllLocations标志.您可以在存储过程和ad-hoc查询中使用它来加入Article.在其他情况下,视图可能是适当的.
欢迎您借用的另一个功能(“从朋友那里窃取!”)是让管理员的登录页面成为“例外”页面.在这里,我展示的东西从大规模的火焰灾难到简单的peccadillos.在这种情况下,与零位置相关联的文章将被视为非关键的内容,但值得检查.
在每个位置明确显示的文章可能会对添加新位置的人感兴趣,因此我可能会有一个网页.可能应更新某些文章以明确说明新位置,或重新考虑更改为所有位置.