SQLVIEW是一个全局逻辑表,该表可能会持久化也可能不会持久化。但这仍然是一张桌子。因此,VIEW是否应始终遵循第一范式(1NF)?也就是说,没有重复的行,仅是标量类型,没有从上到下或从左到右的顺序,等等。较高的范式怎么办?
对我来说,我的应用程序“使用”存储的proc的结果,我的VIEWs被SQL查询“使用”,并且这两种用法是互斥的(即,我不使用SQL查询存储的proc的结果集,而我的应用程序则不包含SQL代码)。我已经看到其他人使用VIEW将一列中的多个值“连接”为单行,通常以逗号分隔格式。针对此类列在SQL查询中编写谓词需要类似以下的语句:
',' + concat_col + ',' LIKE '%' + ',' + search_value + ',' + '%'
因此,在我看来,可以查询的所有表仅由标量类型组成似乎是合理的。我是否会因为这种想法而变得过于“纯粹”?
确保将您的视图标准化为至少1NF是非常有意义的。例如,允许重复具有以下缺点:视图的含义不明确,并且用户可能会误识别信息。如果基于此类歧义更新表,则可能会出现不正确的数据。
EFCodd不一定同意。在他的RM第2版书中,他提议允许视图不带键- 我认为这是一个大错误。Codd的视图实际上不允许重复,但它们允许每一列都可以为空,因此没有键且不在1NF中。
包含逗号分隔列表的字符串值本身并不违反1NF。字符串值与其他任何值一样都是标量,无论它包含什么。大多数SQL DBMS不允许多值属性。