【问题标题】:Improve relationship between 3 tables in MySQL改善MySQL中3个表之间的关系
【发布时间】:2017-06-13 17:45:30
【问题描述】:

我的数据库中有 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 |
+-----+---------+-------------------+

因此,按照上面的结构,payment_methods 被用户 John 屏蔽,cash 被 Davis 屏蔽。

当有多个用户和支付方式时,我将在user_blocked_pm 上拥有多条记录,因为每个用户只被允许使用几种支付方式。

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

【问题讨论】:

  • 注意ubpm中的id是多余的
  • 因此您可以在用户级别添加一个字段以指示所有付款方式都被阻止,或者您可以在 user_blocked_PM 允许单独的块。并注意桌子不应该很大。我希望大多数客户和付款方式不会被阻止
  • @xQbert,这对于少数 pm 来说效果很好,直到用户决定根据付款期限创建大约 72 个,并且该州的不同城市制作了大约 134k 行的 blocked_pm 表。 ..

标签: mysql database relational-database database-administration


【解决方案1】:
  • 您不需要 user_blocked_pm 表中的 id 列,因为您要在 user_id 或 pm_id 上进行选择
  • 如果允许的 pm 的数量少于不允许的数量,为什么不制作 user_allowed_pm 表而不是 user_blocked_pm
  • 如果您为每个用户设置了固定数量的 pm,那么您不需要一个表,只需为每个 pm 创建一个列并放置 pm 的键(如外键)

【讨论】:

  • 我将删除 user_blocked_pm 中的 id 列,但问题是,在这种特殊情况下,被阻止的 pm 数量少于允许的 pm 并且不,不幸的是每个 pm 的数量用户不固定...
【解决方案2】:

如果您有几个用户“类型”,那么也许您可以将user_blocked_pm 替换为user_type_blocked_pm。 “类型”是一组阻止/允许的付款方式。所以user_type_blocked_pm 表很小——有不同类型的条目(只能用现金支付的用户,可以用信用卡和现金支付的用户等)然后,您可以在users 表中添加一列指示用户类型。

【讨论】:

    【解决方案3】:

    你的方法很好,到目前为止提出的其他想法也很好。如果支付类型的数量很少(比如不超过 7 种,当然少于 64 种!)并且是有限的,那么您还可以考虑按位方法,其中 1 = 信用卡,2 = 现金,3 = 两者。我一周中的几天都这样做,不太可能超过 7 天。

    【讨论】:

    • 你显然没有看到我的 Kickstarter 为 Strawberrday 游说资金。我想它会在 Dataday 和 Stackerday 之间进行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多