我目前正在使用PHP和MySQL开展Web项目。 我在MySQL遇到问题,我需要一个建议。
我可以用两种方法解决我的问题,但我不知道哪一种方法比另一种方法更有效,更快。
我需要存储与特定用户关联的多个类别和子类别。用户可以拥有的类别和子类别数量没有具体限制(可能是一个很大的数量)。
categories
的列,其中我保存了PHP中带有所有类别和子类别的序列化数组。
例如:{1:Sports:badminton;2:Sports:baseball;3:Trip:Canada;4:Trip:USA;5:Trip:MEXICO;}
好的一面是我可以腾出空间,而且更紧凑。 不好的一面是,我不能在我的表类别,子类别之间建立任何关系。
user_categories
的表,列(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 ║
╚═════╩═════════╩════════╩═════════════╝
好的一面是我可以在这些表之间建立完美的关系。
缺点是,当它开始吸引越来越多的用户时,它们会在user_categories
中大量进入......
那我该怎么办? 感谢
答案 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_id
和activity_id
,其中的条目表示"此用户执行此活动"。您可能需要一个唯一性约束来确保每个用户只能"做"每次活动一次。
根据您的设置,您要么想要一个单独的表格,要么不是。如果我是你,那么当你觉得你真的需要时,我很想开始简单并重构category
作为它自己的桌子。 (如果您在category
上查询了很多,并且您的活动表变得非常庞大。)