0

给定一系列复杂的网站,它们都使用相同的用户跟踪 mysql 数据库。(这不是我们的确切情况:而是简化情况以使这篇文章尽可能简短/高效)

当用户开始使用网站时,我们并不总是知道他在哪里。事实上,代码中有大约 50 个点可能会更新国家/地区字段。我们可能会从使用时的 IP 地址收集它。当他使用他的信用卡时,我们可能会得到它。当他填写表格时,我们可能会得到它。哎呀,当我们通过电话与他交谈时,我们可能会得到它。

假设一个简单的结构,如:

CREATE  TABLE `Users` (
  `ID` INT NOT NULL AUTO_INCREMENT ,
  `County` VARCHAR(45) NULL ,
  PRIMARY KEY (`ID`) );

我想知道的是跟踪有关此人的另一条信息的最佳方法是什么:

   `Number_of_Users_in_My_Country`.

我知道我可以运行一个简单的查询来获取每条记录。但我经常需要另外两条信息:(请记住,我并不是真正与国家打交道,而是与其他群体打交道,数量在 100,000X :再次:县只是为了让这篇文章变得简单)

  1. 按国家和地区划分的用户数

  2. 选择少于 x 个用户的国家。

我想知道当国家/地区值更改以更新 Number_of_Users_in_My_Country 字段时是否应该创建触发器?

作为 mySQL 的新手,我很想知道对这种方法或任何其他方法的想法。

4

2 回答 2

0

很多人会告诉你不要这样做,因为它没有标准化。但是,如果保持聚合值很简单(在某些查询中保存复杂的连接),我会说去吧。请记住,您的触发器不能更新与触发器定义相同的表,因此在定义某些事件如何将更新传播到其他表时要小心,以免陷入循环。

另一个建议:我会为国家保留一张表格,并使用从用户到国家的外键引用。然后在国家/地区,为该国家/地区的总用户提供一列。users_in_my_country 似乎有一个非常具体的用途,从国家的角度来看会更容易维护。

于 2013-05-31T18:55:30.973 回答
0

鉴于您已经在一定程度上简化了问题,因此很难完全准确。

一般来说,如果可能的话,我更喜欢即时计算这些派生值。为了确定它是否有价值,我更愿意尝试一下;100.000x 记录并不是一个特别可怕的数字,我更愿意花时间调整查询/索引方案一次,而不是在应用程序的生命周期中处理疯狂的维护。

如果您已经尝试过,但仍然无法正常工作,那么我的下一个考虑将是使用陈旧/缓存的数据。这完全取决于您的业务,但如果“我的国家/地区的用户数”值稍微过时是可以的,那么计算这些值并将它们缓存在应用程序层中会好得多。缓存有很多你可以使用的预先存在的库,大多数开发人员都很好理解,而且对于高流量的网站,即使是几秒钟的缓存也会对你的性能和可伸缩性产生巨大的影响。或者,有一个脚本填充一个表“country_usercount”并每隔一分钟左右运行一次。

如果数据必须绝对是新鲜的,我会在应用程序层代码中包含更新计数的逻辑 - 这有点难看,但它很容易调试,并且行为可预测。因此,每次触发告诉您用户来自哪个国家/地区的事件时,您都会从应用程序代码更新 country_usercount 表。

我不喜欢触发器的原因是它们会导致可怕的、难以复制的错误和性能问题——如果你有几个聚合的预先计算的字段,并且为每个字段编写一个触发器,那么你很容易会遇到很多意想不到的问题数据库活动。

于 2013-05-31T20:22:16.533 回答