存储与用户关联的类别和子类别
Storing categories and subcategories associated with a user
我目前正在使用 PHP 和 MySQL 开发一个网络项目。
我在 MySQL 中遇到问题,需要建议。
我可以用两种方法解决我的问题,但我不知道哪种方法比另一种更有效、更快速。
我需要存储与特定用户关联的多个类别和子类别。用户可以拥有多少类别和子类别没有具体限制(可以是很大的数字)。
- 第一种方法,我在我的用户 (MySQL) 的 table 中添加了一个名为
categories
的列,我在其中保存了一个来自 PHP 的序列化数组所有这些类别和子类别。
例如:{1:Sports:badminton;2:Sports:baseball;3:Trip:Canada;4:Trip:USA;5:Trip:MEXICO;}
它好的一面是我可以 space space 而且它更紧凑。
不利的一面是我无法在我的 table 类别、子类别之间建立任何关系。
- 第二种方法,我创建了一个名为
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_id
和 activity_id
,其中的一个条目表示 "this user does this activity"。您可能需要一个唯一性约束以确保每个用户只能 "do" 每个 activity 一次。
根据您的设置,您可能需要单独的 table 类别。如果我是你,当你觉得你确实需要时,我很想从简单开始并重构 category
作为它自己的 table。 (比如如果您在 category
上查询很多并且您的活动 table 变得很大。)
我目前正在使用 PHP 和 MySQL 开发一个网络项目。 我在 MySQL 中遇到问题,需要建议。
我可以用两种方法解决我的问题,但我不知道哪种方法比另一种更有效、更快速。
我需要存储与特定用户关联的多个类别和子类别。用户可以拥有多少类别和子类别没有具体限制(可以是很大的数字)。
- 第一种方法,我在我的用户 (MySQL) 的 table 中添加了一个名为
categories
的列,我在其中保存了一个来自 PHP 的序列化数组所有这些类别和子类别。 例如:{1:Sports:badminton;2:Sports:baseball;3:Trip:Canada;4:Trip:USA;5:Trip:MEXICO;}
它好的一面是我可以 space space 而且它更紧凑。 不利的一面是我无法在我的 table 类别、子类别之间建立任何关系。
- 第二种方法,我创建了一个名为
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_id
和 activity_id
,其中的一个条目表示 "this user does this activity"。您可能需要一个唯一性约束以确保每个用户只能 "do" 每个 activity 一次。
根据您的设置,您可能需要单独的 table 类别。如果我是你,当你觉得你确实需要时,我很想从简单开始并重构 category
作为它自己的 table。 (比如如果您在 category
上查询很多并且您的活动 table 变得很大。)