存储与用户关联的类别和子类别

Storing categories and subcategories associated with a user

我目前正在使用 PHP 和 MySQL 开发一个网络项目。 我在 MySQL 中遇到问题,需要建议。

我可以用两种方法解决我的问题,但我不知道哪种方法比另一种更有效、更快速。

我需要存储与特定用户关联的多个类别和子类别。用户可以拥有多少类别和子类别没有具体限制(可以是很大的数字)。

  1. 第一种方法,我在我的用户 (MySQL) 的 table 中添加了一个名为 categories 的列,我在其中保存了一个来自 PHP 的序列化数组所有这些类别和子类别。 例如:{1:Sports:badminton;2:Sports:baseball;3:Trip:Canada;4:Trip:USA;5:Trip:MEXICO;}

它好的一面是我可以 space space 而且它更紧凑。 不利的一面是我无法在我的 table 类别、子类别之间建立任何关系。

  1. 第二种方法,我创建了一个名为 user_categories 的 table,其中包含列 (entry_id, user_id, category, sub_category),然后我添加了每个条目。

例如:

╔═════╦═════════╦════════╦═════════════╗
║ 1   ║ VM1974  ║ Sport  ║ badminton   ║
║ 2   ║ VM1974  ║ Sport  ║ baseball    ║
║ 3   ║ VM1974  ║ Trip   ║ Canada      ║
║ 4   ║ VM1974  ║ Trip   ║ USA         ║
║ 5   ║ VM1974  ║ Trip   ║ Mexico      ║
║ 6   ║ MC1959  ║ Sport  ║ badminton   ║
║ 7   ║ MC1959  ║ Sport  ║ golf        ║
║ 8   ║ MC1959  ║ Trip   ║ Canada      ║
║ 9   ║ MC1959  ║ Trip   ║ USA         ║
║ 10  ║ MC1959  ║ Trip   ║ Mexico      ║
╚═════╩═════════╩════════╩═════════════╝

好的一面是我可以在那些 table 之间建立完美的关系。 不利的是,当它开始获得越来越多的用户时,他们将在这个user_categories中有很多条目...

那我该怎么办? 谢谢

你应该使用第二种方法。如果你使用第一个,有时你会打印错误,你的数据库将不再一致。 看看 database normalization,您总会知道更好的方法。
如果不同用户的类别相同,您最好创建 "categories" table 类别和 "user_categories" 列 (entry_id, user_id, category_id).使用这样的结构,您可以轻松地统计特定类别的用户。也看看 enum type and to databases with build-in json type (like postgresql)

我也喜欢你的第二种方法!

关系对于您进一步 SQL 加入和进一步分析很重要。

另一点是,您必须始终为每条记录和每一步序列化您的数据,并且不能使用您的数据库。

在我看来你这里有两个实体和一个(或两个)关系:

  • user,可以有 0 个或多个活动
  • activity,其中只有一个类别。 (例如,高尔夫,这是一项运动)

所以我有三个 table:一个用于用户,一个用于活动(其中有一个 description 列和一个 category 列),一个用于关系 user_activities.

最后一个 table 只有 user_idactivity_id,其中的一个条目表示 "this user does this activity"。您可能需要一个唯一性约束以确保每个用户只能 "do" 每个 activity 一次。

根据您的设置,您可能需要单独的 table 类别。如果我是你,当你觉得你确实需要时,我很想从简单开始并重构 category 作为它自己的 table。 (比如如果您在 category 上查询很多并且您的活动 table 变得很大。)