改善MySQL {3}中3个表之间的关系

时间:2017-06-13 17:45:31

标签: mysql database relational-database database-administration

我的数据库中有3个表:userspayment_methodsuser_blocked_pmusers表格不言而喻,payment_methods存储公司使用的所有付款方式,而user_blocked_pm则为特定用户屏蔽了付款方式。

+------------------+
|       users      |
+-----+------------+
|  id |  user_name |
+-----+------------+
|   1 |       John |
|   2 |      Davis |
+-----+------------+

+-----------------------+
|    payment_methods    |
+-----+-----------------+
|  id |  payment_method |
+-----+-----------------+
|   1 |     credit_card |
|   2 |            cash |
+-----+-----------------+

+-----------------------------------+
|          user_blocked_pm          |
+-----+---------+-------------------+
|  id | user_id | payment_method_id |
+-----+---------+-------------------+
|   1 |       1 |                 1 |
|   2 |       1 |                 2 |
|   3 |       2 |                 2 |
+-----+---------+-------------------+

因此,按照上述结构,用户John阻止了payment_methods,而且戴维斯阻止了cash

当有多个用户和付款方式时,我会在user_blocked_pm上有多个记录,因为每个用户只能使用一些付款方式。

有没有更好的方法来处理usersuser_blocked_pm之间的这种关系,以便表格不会变得巨大?

3 个答案:

答案 0 :(得分:0)

  • 您不需要 user_blocked_pm 表中的 id 列,因为您要选择user_id或pm_id
  • 如果允许的pm数小于不允许的数量,为什么不制作 user_allowed_pm 表而不是 user_blocked_pm
  • 如果每个用户都有一个固定数量的pm,那么你不需要一个表,只需为每个pm创建一个列,然后你输入pm的键(就像一个外键)

答案 1 :(得分:0)

如果您有几个用户"类型",那么您可以将user_blocked_pm替换为user_type_blocked_pm。 A"类型"是一组被阻止/允许的付款方式。所以user_type_blocked_pm表很小 - 有不同类型的条目(只能用现金支付的用户,可以用信用卡和现金支付的用户等)然后,你可以在{{{{{ 1}}表以指示用户类型。

答案 2 :(得分:0)

你的方法很好,到目前为止提出的其他想法也没问题。如果支付类型的数量很小(不超过7,比如说 - 当然少于64!)和有限,那么你也可以考虑一种按位方法,其中1 = credit_card,2 = cash,3 = both。我这样做的几天都不会超过7天。