1

我正在开发 Web 应用程序,我必须像 facebook 一样实现“喜欢”系统。应用程序将有一些客户可以“喜欢”的产品类别。所以我已经开始创建数据库,但我遇到了一个障碍。据我了解,有两种方法可以做到这一点:

第一的。创建一个数据库表,字段为“id、user_id、item_category、item_id”。当用户单击“喜欢”按钮时,信息将与各种产品类别(item_category)一起保存在此表中。

第二。为某些类别的项目创建多个表。例如,“tbl_item_category_1, tbl_item_category_2, tbl_item_category_3”的字段为“user_id, item_id”。

如果能更深入地了解这种数据库结构的最佳实践,那就太好了。哪个工作得更快?更合乎逻辑/实用?我将只使用几类项目。

4

3 回答 3

2

我会选择第一个版本,其表结构类似于:

User Table: PK id
id
username

Category Table: PK id
id
categoryname

Like Table: PK both user_id and catgory_id
user_id
category_id

这是一个带有表结构演示的SQL Fiddle,其中包含两个示例查询,以提供用户的总喜欢数和按类别的总喜欢数

第二个 - 创建多个表是一个糟糕的主意。如果您有 50-100 个类别试图查询这些表,那将是可怕的。它将变得完全无法管理。

如果您有多个表试图获得总喜欢数将是:

Select count(*)
from category_1
JOIN category_2
    ON userid = userid
join category_3
    ON userid = userid
join .....

使用一张桌子,毫无疑问。

于 2012-05-31T10:45:08.993 回答
1

第一种方法是正确的。永远不要为项目类别创建多个表,这会使维护代码成为一场噩梦,并使查询变得丑陋。

事实上,一般规则是任何动态的(即变化的)都不应存储为一组静态对象(例如表)。如果您认为以后可能会添加一种新类型的“某物”,那么您需要一个“某物”类型表。

例如,想象一下尝试计算用户喜欢的项目数量。使用第一种方法,你可以做SELECT COUNT(*) FROM likes WHERE user_id = 123,但在第二种方法中,你需要做一个 JOIN 或 UNION,这对性能不利,对可维护性不利。

于 2012-05-31T10:44:11.403 回答
0

第一种方法是正确的。因为您不知道您将拥有多少个类别,并且很难获取数据。

于 2012-05-31T10:45:23.407 回答