维护“国家用户”的最佳方法是计算MySql

时间:2013-05-31 18:23:21

标签: mysql

鉴于一系列复杂的网站都使用相同的用户来修复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的国家/地区。

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

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

2 个答案:

答案 0 :(得分:0)

很多人会告诉你不要这样做,因为它没有正常化。但是,如果保持聚合值(在某些查询中保存复杂的连接)是微不足道的,我会说它去做。请记住您的触发器无法更新与触发器定义相同的表,因此请务必定义某些事件如何将更新传播到其他表,以免进入循环。

附加建议:我会为国家/地区保留一个表格,并使用从“用户到国家/地区”的外键引用。然后在国家/地区,为该国家/地区的总用户设置一列。 Users_in_my_country似乎有一个非常具体的用途,从各个国家的角度来看,它更容易维护。

答案 1 :(得分:0)

鉴于你在某种程度上简化了问题,很难完全准确。

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

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

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

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