MYSQL - 多个多对多选择

Posted

技术标签:

【中文标题】MYSQL - 多个多对多选择【英文标题】:MYSQL - multiple many to many selection 【发布时间】:2021-10-28 05:55:55 【问题描述】:

我有多个与一个主要实体相关的多对多关系。

表格(名称不同,但更容易演示):

products
    - id
    - every other data


colors
    - id
    - every other data

sizes
    - id
    - every other data

product_color
    - product_id
    - color_id

product_size
    - product_id
    - size_id

我想在某处存储一个数字,例如50件绿色和XXL尺寸的T恤产品,但只有20件绿色和M尺寸的T恤产品。我将把这个号码存储在哪里?我的数据库结构对那个有效吗?我正在使用 eloquent + mysql

【问题讨论】:

写出一些你需要的SELECTs。 -- 让这可以帮助您了解架构的好坏。 【参考方案1】:

我会丢失 product_colorproduct_size 表,并添加一个带有外键的 stock 表到产品、尺寸和颜色:

stock
  - id         -- May be redundant, depends on your application
  - product_id -- FK to products.id
  - color_id   -- FK to colors.id
  - size_id    -- FK to sizes.id
  - amount

【讨论】:

星型模式的搜索速度非常慢。【参考方案2】:

你需要创建 4 个表 -

    产品表 - 与产品相关的信息,例如名称、图片、描述、状态 选项表 - 与选项相关的信息,例如尺寸、颜色 期权价值 - 与期权价值相关的信息,例如 XL、XXL、RED、GREEN、BLUE 依赖选项 - 用于选项
products
    - product_id (Primary key)
    - every other data
option 
    - option_id (Primary key)
    - option_name(color|size)
option_value
    - option_value_id
    - option_id
    - name

product_option
    - product_id
    - option_id
    - Quantity
Product - 
| product_id | name         |
| -------- | -------------- |
| 1        | Tshirt         |
| 2        | Jeans          |


Option
| option_id | option_name   |
| -------- | -------------- |
| 5        | Size           |
| 6        | Color          |


Option_value
| option_value_id | option_id      |option_name| 
| --------        | -------------- |-----------|
| 8               | 5              |   XXL     | 
| 9               | 5              |   L       | 
| 10              | 6              |   RED     |
| 11              | 6              |   BLUE    |



dependent_option
| id | parent_option_value_id| child_option_value_id|   Qty     | 
|----| --------------------- | -------------------- |-----------|
| 1  | 8                     | 10                   |   200     | XXL-RED 
| 2  | 8                     | 11                   |   9       | L-RED
| 3  | 9                     | 10                   |   300     | XXL-BLUE
| 4  | 9                     | 11                   |   4999    | L-BLUE




【讨论】:

这是一个充满问题的“实体-属性-值”的变体。

以上是关于MYSQL - 多个多对多选择的主要内容,如果未能解决你的问题,请参考以下文章

MySQL严格选择涉及多对多表的行

使用 PHP 处理多对多数据库关系并选择/插入多个复选框值 MYSQL

hibernate多对多查询

通过 SQLAlchemy 选择多个多对多关系

Prisma:在多个条件下选择多对多

MYSQL在一个语句中多对多选择(聊天,最新消息,用户名)