Database 创建数据库时-是否建议为我可以根据其他字段计算的数据创建列?

Database 创建数据库时-是否建议为我可以根据其他字段计算的数据创建列?,database,field,Database,Field,我正在为一名律师创建一个应用程序,他可以在其中创建一个客户投资组合。在这个投资组合中,有投资组合的ID、创建日期、客户的姓名、电话等 除了所有这些字段之外,还有一个字段:“投资组合名称”。此字段包含来自其他字段的有关客户端的一些信息,格式为文本 例如,如果: ID=271 客户名称=“John Doe” 创建日期=2016年2月18日 投资组合名称将为271/John Doe/18022016 现在,既然portifolio_名称实际上并不包含新数据,而是只包含来自其他字段的格式化数据,那么它是

我正在为一名律师创建一个应用程序,他可以在其中创建一个客户投资组合。在这个投资组合中,有投资组合的ID、创建日期、客户的姓名、电话等

除了所有这些字段之外,还有一个字段:“投资组合名称”。此字段包含来自其他字段的有关客户端的一些信息,格式为文本

例如,如果:

  • ID=271
  • 客户名称=“John Doe”
  • 创建日期=2016年2月18日
  • 投资组合名称将为271/John Doe/18022016


    现在,既然portifolio_名称实际上并不包含新数据,而是只包含来自其他字段的格式化数据,那么它是否真的应该作为列存在于数据库表中?是否存在数据重复?

    这取决于表的大小和查询表的方式

    如果表格较大,则可以为计算字段创建列。这样便于查询


    如果表很小,您可以在查询中进行计算,这取决于表的大小和查询表的方式

    如果表格较大,则可以为计算字段创建列。这样便于查询


    如果可以在查询中计算的表很小,大多数数据库引擎都允许您为此创建计算列。根据引擎和设置计算列的方式,它可能会保存到磁盘,也可能不会保存到磁盘,但它将保证始终是最新的。好的是,你可以把它当作一个只读的专栏


    大多数数据库引擎允许您为此目的创建计算列。根据引擎和设置计算列的方式,它可能会保存到磁盘,也可能不会保存到磁盘,但它将保证始终是最新的。好的是,你可以把它当作一个只读的专栏


    这是违反1NF的教科书,通常应避免。在某些情况下,这是可以接受的——例如,计算值很难获得或很耗时。但是,由于字符串连接非常简单(您甚至可以在查询中正确地进行连接,而无需定义任何伪字段),因此我不建议您这样做,除非字段仅包含初始默认值,并且客户端可以在以后对其进行自定义。否则,它最终将变得不一致。例如,当客户名称发生变化时会发生什么情况?

    这是违反1NF的教科书,通常应避免。在某些情况下,这是可以接受的——例如,计算值很难获得或很耗时。但是,由于字符串连接非常简单(您甚至可以在查询中正确地进行连接,而无需定义任何伪字段),因此我不建议您这样做,除非字段仅包含初始默认值,并且客户端可以在以后对其进行自定义。否则,它最终将变得不一致。例如,当客户端名称更改时会发生什么情况?

    这是数据重复,但在某些情况下,级别或冗余是可以接受的。具体取决于。如果DB支持的话,我至少会将它作为表中的实际计算列。如果他换了一种无法计算的格式,你会有很多返工工作要做。你能回答一下吗?所以其他人可以更容易地从您的答案中受益?这是数据重复,但在某些情况下,级别或冗余是可以接受的。具体取决于。如果DB支持的话,我至少会将它作为表中的实际计算列。如果他换了一种无法计算的格式,你会有很多返工工作要做。你能回答一下吗?所以其他人可以更容易地从你的答案中受益?我想这是一张大桌子。成千上万的记录。。。但是,即使查询稍微复杂一点,进行数据复制不是很糟糕吗?数千条记录并不算大。:)我想这是一张大桌子。成千上万的记录。。。但是,即使查询稍微复杂一点,进行数据复制不是很糟糕吗?数千条记录并不算大。:)SQL计算列在不破坏1NF的情况下解决了这个问题。当然,这是一个可行的解决方案,假设您的数据库支持它们。但是,请注意,计算列不是标准的SQL,因此您引入了对特定数据库引擎的依赖,只不过是简单的字符串连接。此外,计算将被视为业务逻辑,因为它将被构建到您的模式中,而不是应用程序代码中,所以如果它发生更改,它将不会(很容易)受到源代码控制。SQL计算列在不破坏1NF的情况下解决了这一问题。当然,这是一个可行的解决方案,假设您的数据库支持它们。但是,请注意,计算列不是标准的SQL,因此您引入了对特定数据库引擎的依赖,只不过是简单的字符串连接。此外,该计算将被视为业务逻辑,并且由于它将构建到您的模式中而不是应用程序代码中,因此,如果它发生更改,它将(不容易)受到源代码控制。