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

时间:2015-06-27 19:02:22

标签: relational-database

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

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

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

  1. 第一种方法,我在我的用户(MySQL)的表中添加了一个名为categories的列,其中我保存了PHP中带有所有类别和子类别的序列化数组。 例如:{1:Sports:badminton;2:Sports:baseball;3:Trip:Canada;4:Trip:USA;5:Trip:MEXICO;}
  2. 好的一面是我可以腾出空间,而且更紧凑。 不好的一面是,我不能在我的表类别,子类别之间建立任何关系。

    1. 第二种方法,我创建了一个名为user_categories的表,列(entry_id, user_id, category, sub_category),我添加了每个条目。
    2. 例如:

      ╔═════╦═════════╦════════╦═════════════╗
      ║ 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      ║
      ╚═════╩═════════╩════════╩═════════════╝
      

      好的一面是我可以在这些表之间建立完美的关系。 缺点是,当它开始吸引越来越多的用户时,它们会在user_categories中大量进入......

      那我该怎么办? 感谢

3 个答案:

答案 0 :(得分:1)

您应该使用第二种方法。如果您使用第一个,那么有时您会进行错误打印,并且您的数据库不再是一致的。 看看database normalization,你总会知道更好的方法 如果您的类别对于不同的用户是相同的,那么您可以更好地创建"类别"具有类别的表和" user_categories"列(entry_id,user_id,category_id)。有了这样的结构,您可以轻松计算确定类别的用户。另请查看enum类型和内置json类型的数据库(如postgresql

答案 1 :(得分:0)

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

关系对于进一步的SQL连接和进一步分析非常重要。

另一点是,您必须始终为每个记录和每个步骤分类数据,并且不能使用您的数据库。

答案 2 :(得分:0)

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

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

所以我有三个表:一个用于用户,一个用于活动(具有description列和category列),另一个用于关系user_activities

最后一张表只有user_idactivity_id,其中的条目表示"此用户执行此活动"。您可能需要一个唯一性约束来确保每个用户只能"做"每次活动一次。

根据您的设置,您要么想要一个单独的表格,要么不是。如果我是你,那么当你觉得你真的需要时,我很想开始简单并重构category作为它自己的桌子。 (如果您在category上查询了很多,并且您的活动表变得非常庞大。)