我有2个表,一个purchases
表和一个users
表。购买表中的记录如下所示:
purchase_id | product_ids | customer_id
---------------------------------------
1 | (99)(34)(2) | 3
2 | (45)(3)(74) | 75
用户表如下所示:
user_id | email | password
----------------------------------------
3 | joeShmoe@gmail.com | password
75 | nolaHue@aol.com | password
要获取用户的购买历史记录,我使用如下查询:
mysql_query(" SELECT * FROM purchases WHERE customer_id = '$users_id' ");
问题是,当将数万条记录插入购买表时会发生什么。我觉得这会带来性能损失。
所以我考虑将购买直接存储在用户行中的附加字段中:
user_id | email | password | purchases
------------------------------------------------------
1 | joeShmoe@gmail.com | password | (99)(34)(2)
2 | nolaHue@aol.com | password | (45)(3)(74)
当我在用户的桌子上查询用户名等内容时,我可以轻松地使用该查询获取他们的购买历史记录。
这是一个好主意,它会有助于提高性能,还是利益微不足道,不值得让数据库变得更加混乱?
我真的想知道专业人士在这些情况下做了些什么,例如亚马逊如何查询用户购买历史记录的数据库,因为他们拥有数百万客户。为什么查询不花费数小时?
好的,所以我想让它们分开是要走的路。现在问题是设计问题:
我应该继续使用前面说明的“购买”表。在该设计中,我使用括号分隔每次购买的产品ID,并使用此作为分隔符,以便在通过PHP提取它们时将它们区分开来。
相反,我应该将每个产品ID分别存储在“购买”表中,这样看起来像这样吗?:
purchase_id | product_ids | customer_id
---------------------------------------
1 | 99 | 3
1 | 34 | 3
1 | 2 | 3
2 | 45 | 75
2 | 3 | 75
2 | 74 | 75
答案 0 :(得分:1)
不,这是一个非常非常非常糟糕的主意。
您打破了第一个普通表单,因为您不知道如何翻阅大型数据集。
亚马逊和雅虎!谷歌可以带回(可能)数百万条记录 - 但它们只能以10或25或50的方式一次性显示给你。
他们也很聪明地猜测或计算哪些是你最感兴趣的 - 他们先向你展示。
在我的历史记录中,我最有可能感兴趣的是哪些购买?当然是最近的那些。
在违反关系数据库基础之前,您应该考虑将这些构建到您的设计中。
答案 1 :(得分:0)
通过对您的架构执行此操作,您将破坏数据库的实体关系。
您可能希望查看Memcached,NoSQL和Redis。 这些都是可以帮助您提高查询性能的工具,主要是通过将数据存储在RAM中。
例如 - 运行查询一次,将其存储在Memcache中,如果用户刷新页面,则从Memcache获取数据,而不是从MySQL获取数据,这样可以避免再次查询数据库。
希望这有帮助。
答案 2 :(得分:0)
首先,成千上万的记录都不算什么。除非您使用具有有限RAM和硬盘空间的小型weensy机器运行,否则数据库甚至不会闪烁100,000条记录。
至于在用户表中存储购买详情...如果用户进行多次购买会怎样?
答案 3 :(得分:0)
MySQL具有极大的可扩展性,并且不要让它自由的事实说服你。保持两个表分离可能是最好的,不仅因为它使数据库更正常,而且拥有更多索引将加快查询速度。 10,000个记录数据库相对较小,与数亿个记录健康记录数据库相关。
就亚马逊和谷歌而言,他们雇佣了数百名开发人员为他们特定的应用程序需求编写专门的查询语言...而不是像我们这样的开发人员有资源来资助。
答案 4 :(得分:0)
您的数据库看起来已经很乱了,因为您在一个字段中存储多个product_ids
,而不是像这样创建一个“关联”表。
_____product_purchases____
purchase_id | product_id |
--------------------------
1 | 99 |
1 | 34 |
1 | 2 |
您仍然可以在一个查询中获取它:
SELECT * FROM purchases p LEFT JOIN product_purchases pp USING (purchase_id)
WHERE purchases.customer_id = $user_id
但这也为您提供了更多的可能性,例如找出购买了多少产品#99,获得了购买产品#34等所有客户的清单。
当然,不要忘记索引,这将使所有这些更快。