【问题标题】:Database design challenge数据库设计挑战
【发布时间】:2010-10-19 18:11:22
【问题描述】:

我正在为 iphone 创建一个虚拟邮票卡程序,但在实现我的数据库时遇到了问题。该程序本质上有一个积分系统,可以通过所有商家使用(有点像航空里程),但我也想跟踪您去过每个商家的次数

到目前为止,我已经为用户、商家和交易创建了 3 个主表。

1) 用户表包含基本信息,如 user_id 和收集的总积分。

2) Merchants 表包含诸如 Merchants_id、位置、总积分等信息。

3) 每次有人签到每个商家时,交易表都会创建一个新行,并记录日期戳、用户名、商家名称和奖励积分。

因此,了解您去过每个商家多少次的最基本方法是查询用户和商家的整个交易表,这将为我提供您多少次的交易历史记录'去过那个特定的商家(这是完美的),但从长远来看,我觉得这对性能来说是可怕的。

实现这一点的另一种简单但“愚蠢”的方法是在用户表中为每个商家创建一个列,并将运行总数保留在那里。这似乎不合适,因为我会定期添加新商家,并且每次发生这种情况时都需要为每个用户添加新列。

我已经研究了 mySQL 数据库的一对多和多对多关系,但似乎无法提出一些非常具体的东西,因为我对 web/PHP/mySQL 开发非常陌生但我猜这就是我要找的……

我还考虑为每个用户创建一个特殊的交易表,其中有一列用于商家,另一列用于访问次数。同样,不确定这是否是最有效的实现方式。

有人能指出正确的方向吗?

【问题讨论】:

  • Foursquare 和 Gowalla 是我正在寻找的实现类型的好例子。关于他们如何跟踪您在每个商家的使用情况的任何想法?

标签: iphone mysql database-design


【解决方案1】:

从考虑不同选项并权衡每个选项的好与坏的意义上说,您正在做正确的事。

就我个人而言,我会选择一个 MerchantCounter 表,该表通过 id_merchant 连接到您的 Merchant 表(例如),并且您明确地保持最新状态。

随着时间的推移,它不会变慢(与活动搜索不同),并且不会占用大量空间。

编辑:根据您的评论,Janan,不,我会使用单个 MerchantCounter 表。这样你就有了 Merchant 表:

id_merchant        nm_merchant
12                 Jim
15                 Tom
17                 Wilbur

您将添加一个额外的表 MerchantCounter(已编辑以显示如何统计单个用户的总数):

id_merchant    id_user     num_visits
12             101         3
12             102         8
15             101         6007
17             102         88
17             104         19
17             105         1

您可以看到 id_merchant 如何将表链接到 Merchant 表,以及 id_user 如何链接到另一个 User 表。

【讨论】:

  • 如果我有 50 个商家,这是否意味着除了 3 个原始表格之外,我还必须有 50 个新表格(每个表格一个)链接到主商家表格。这是你的意思吗?另外,这是一种很好的“编程实践”吗?
  • +1 布赖恩。 @Janan:如果最终性能确实会随着容量的增加而降低,您可以考虑归档和/或分区,以及您提到的非规范化技术。如果您可以在测试期间以预期的数量预先确定这一点,那就更好了!
  • 我实际上已经弄清楚了那部分。抱歉,如果我之前的解释不清楚,请想象一下这个场景:我有 100 个用户和 100 个商家。我想知道用户 15 到商户 50 的确切次数。到目前为止的实现可以告诉我每个人访问商户 50 的次数,但不能告诉我 user1、user2 和 user3 访问了多少次个人。
  • 已再次编辑以显示用户数。顺便说一句,这是一个基本概念;如果您不熟悉此类连接,您将真正受益于花一些时间阅读关系概念,例如dev.mysql.com/tech-resources/articles/…
  • 完美!这正是我想要的。是的,我绝对同意,我将花一些时间来了解如何有效地利用联接。再次感谢布赖恩,非常感谢!