代码之家  ›  专栏  ›  技术社区  ›  onedaywhen

SQL视图是否应始终处于1NF中?

  •  7
  • onedaywhen  · 技术社区  · 17 年前

    SQL视图是一个全局逻辑表,可以持久化,也可以不持久化。但它仍然是一张桌子。因此,视图是否应始终遵循第一范式(1NF)?i、 e.没有重复的行,只有标量类型,没有从上到下或从左到右的顺序,等等。那么更高的范式呢?

    对我来说,我的应用程序“使用”存储过程的结果,我的视图被SQL查询“使用”,这两种用法是相互排斥的(即,我不使用SQL查询存储过程的结果集,我的应用程序不包含SQL代码)。我见过其他人使用视图将一列中的多个值“串联”成一行,通常采用逗号分隔的格式。在SQL查询中针对此类列编写谓词需要类似于以下内容的乱码:

    ',' + concat_col + ',' LIKE '%' + ',' + search_value + ',' + '%'
    

    因此,在我看来,期望所有可以查询的表都只包含标量类型是合理的。我这样想是不是太“纯粹”了?

    7 回复  |  直到 17 年前
        1
  •  3
  •   nvogel    15 年前

    否-我创建视图以匹配程序所需的输出。

        2
  •  9
  •   Galwegian    17 年前

    关系系统的全部要点是,为了提高效率和/或可管理性,将数据保持在规范化关系中,然后使用关系运算符将其转换为所需的关系。

    这就是为什么您应该以最适合您的应用程序需要的形式创建它。

    看见 this answer 更多细节。

        3
  •  4
  •   Community Mohan Dere    9 年前

    不过E.F.Codd并不一定同意。在他的RM版本2书中,他建议允许视图不带键——我认为这是一个很大的错误。Codd的视图实际上不允许重复,但它们允许每个列都可以为空,因此没有键,也不在1NF中。

    包含逗号分隔列表的字符串值本身并不违反1NF。字符串值与任何其他值一样是标量,无论它包含什么。大多数SQL DBMS不允许多值属性。

        4
  •  1
  •   Tom H zenazn    16 年前

    我不认为这是一个规则,但如果它是-没有规则应该 总是 被跟踪。

        5
  •  1
  •   onedaywhen    9 年前

    根据Chris Date,视图应完全规范化:

    选择哪些关系是基本关系,哪些视图是任意的。举个简单的例子,您可能有雇员,您可能有一个包含所有雇员的基本关系,您可能有东海岸雇员和西海岸雇员作为两个视图。或者你可以将东海岸和西海岸的员工作为两个基本关系,并将他们的联合作为一个视图。这完全是武断的。

    DBMS采访Chris Date-1994年10月

        6
  •  0
  •   SQLMenace    17 年前

    视图(除非是物化/索引视图)只不过是一个存储的查询 视图可以包含多个表,可以与同一个表进行自连接等

        7
  •  -2
  •   D'Arcy Rittich    17 年前

    有关详细信息,请参阅 First normal form .