Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:复杂查询或跟踪/计数器字段_Mysql_Sql_Database_Database Design_Data Modeling - Fatal编程技术网

MySQL:复杂查询或跟踪/计数器字段

MySQL:复杂查询或跟踪/计数器字段,mysql,sql,database,database-design,data-modeling,Mysql,Sql,Database,Database Design,Data Modeling,我只是在考虑MySQL数据库的设计,通常情况下 执行或未执行特定操作,因此数据存储或未存储在数据库中 统计显示用户是否执行了特定操作 这方面的一个例子是: 用户是否填写调查。如果他们确实填写了调查,他们提供的数据将存储在数据库中。将显示填写调查的用户总数 现在,为了获得填写调查的用户数量,我们可以 创建一个类型为BOOL的字段,该字段在suvey完成时设置为TRUE;然后,我们使用简单的COUNT(*)计算完成调查的用户数量,其中field=TRUE 通过加入“用户”和“调查结果”表并按用

我只是在考虑MySQL数据库的设计,通常情况下

  • 执行或未执行特定操作,因此数据存储或未存储在数据库中
  • 统计显示用户是否执行了特定操作
这方面的一个例子是:

用户是否填写调查。如果他们确实填写了调查,他们提供的数据将存储在数据库中。将显示填写调查的用户总数

现在,为了获得填写调查的用户数量,我们可以

  • 创建一个类型为
    BOOL
    的字段,该字段在suvey完成时设置为
    TRUE
    ;然后,我们使用简单的
    COUNT(*)计算完成调查的用户数量,其中field=TRUE
  • 通过加入“用户”和“调查结果”表并按用户分组,使用用户提供的数据计算填写调查的用户数
这不是一个特别复杂的示例,但是在某些情况下,如果没有
BOOL
标志,查询可能变得非常复杂和昂贵。但该标志几乎是数据库表中不必要的添加—我们使用它只是为了方便。这还意味着我们必须确保在相关时间更新所有用户标志,以及存储用户数据

解决此类问题的方法是什么?对于较小的应用程序,我通常只编写复杂的查询并缓存其结果(偶尔使用视图使事情更易于管理)。但在可能有许多连接的大型应用程序中,我可能会尝试使用操作字段标记用户,以便读取更简单、更便宜

计算用户数。通过加入用户和 统计调查结果表及分组 用户

如果可以联接用户和调查结果表,则调查结果表必须具有用户标识符,对吗?如果这是正确的,则不需要将这两个表合并以确定完成调查的用户数

计算用户数。通过加入用户和 统计调查结果表及分组 用户


如果可以联接用户和调查结果表,则调查结果表必须具有用户标识符,对吗?如果这是正确的,您不需要将这两个表合并以确定完成调查的用户数。

您所描述的被称为“非规范化视图”,即包含可以从数据库中已有的其他数据计算结果的表。这样做的原因实际上是性能,是否这样做取决于(重新)生成数据的成本、代码中保持一致性所需的工作量,以及存储计算值所需的额外数据库空间。

您所描述的被称为“非规范化视图”,即,包含可从数据库中已有的其他数据计算结果的表。这样做的原因实际上是性能,是否这样做取决于(重新)生成数据的成本、保持数据一致性所需的代码工作量以及存储计算值所需的额外数据库空间。

最好的解决方案是索引视图(SQL Server术语)或物化视图(Oracle术语)或物化查询表(DB2术语)。所有这些解决方案都能实时更新数据,无需维护

当您的平台不支持这些类型的数据库对象时,您必须求助于使用表以及所有其他保持数据正确性所必需的东西

  • 触发
  • cron作业
如果使用触发器,可能还应该定期运行cron作业,以确保存储的数据与计算的数据匹配


在现实世界中,大多数这类需求实际上不必实时更新。这类数字通常支持管理决策;甚至一天的延迟也是可以接受的(换句话说,有时将其视为数据仓库问题或报告而不是OLTP问题会有所帮助)我曾多次协商此类需求。我从未有人拒绝接受两小时的更新周期。(但这当然取决于应用程序。)

最好的解决方案是索引视图(SQL Server术语)或物化视图(Oracle术语)或物化查询表(DB2术语)。所有这些解决方案都能实时更新数据。无需维护

当您的平台不支持这些类型的数据库对象时,您必须求助于使用表以及所有其他保持数据正确性所必需的东西

  • 触发
  • cron作业
如果使用触发器,可能还应该定期运行cron作业,以确保存储的数据与计算的数据匹配


在现实世界中,大多数这类需求实际上不必实时更新。这类数字通常支持管理决策;甚至一天的延迟也是可以接受的(换句话说,有时将其视为数据仓库问题或报告而不是OLTP问题会有所帮助)我曾多次协商此类需求。我从未有人拒绝接受两小时的更新周期(但这当然取决于应用程序)

人们可能会嘲笑数据的完整性,但事实上,在大型项目中,数据库显然会成为瓶颈,我有时会使用“缓存”值。缓存比查询缓存更长寿,比简单的键/值缓存更容易控制/更新。它们大多生活在数据中