Mysql 为下面的简单示例设计模式的最佳方法是什么?

Mysql 为下面的简单示例设计模式的最佳方法是什么?,mysql,database,database-design,database-schema,Mysql,Database,Database Design,Database Schema,对于下面的数据,我一直在使用不同的模式(很多年没有接触数据库),但似乎没有一种模式是理想的 A B C D E 1 Included Included Paid Disabled Paid 2 Included Included Paid Disabled Paid 3 N/A N/A N/A

对于下面的数据,我一直在使用不同的模式(很多年没有接触数据库),但似乎没有一种模式是理想的

    A           B           C           D           E
1   Included    Included    Paid        Disabled    Paid
2   Included    Included    Paid        Disabled    Paid
3   N/A         N/A         N/A         Disabled    Paid
4   Included    Included    N/A         Disabled    Paid
5   N/A         N/A         Included    Disabled    Paid
目前,A-E上有5个附加软件,但可能会扩展,目前还有5个设备1-5个,但还有更多。 软件选项包括、不适用、付费或禁用(未测试)

我最初有逻辑来确定哪个设备在相关软件中有什么选项,但现在有多个接收器将依赖于此信息,因此我希望将其存储在数据库中,并允许其他软件仅提取给定设备类型(1-5)的信息。

我建议使用此选项

device
--------
+id
 title
 ...

sw_addon
--------
+id          // (PK, CK)
+device_id   // (PK, CK, FK from device table)
+addon_name  // (PK, CK)
 addon_option
 ...
以这种方式收集数据

device:
-----------------
| id | title    |
-----------------
|  1 | device 1 |
|  2 | device 2 |
|  3 | device 3 |
|  4 | device 4 |
|  5 | device 5 |
-----------------

sw_addon:
----------------------------------------------
| id | device_id | addon_name | addon_option |
----------------------------------------------
|  1 |         1 | A          | Included     |
|  2 |         1 | B          | Included     |
|  3 |         1 | C          | Paid         |
|  4 |         1 | D          | Disabled     |
|  5 |         1 | E          | Paid         |
|  6 |         2 | A          | Included     |
|  7 |         2 | B          | Included     |
|  8 |         2 | C          | Paid         |
|  9 |         2 | D          | Disabled     |
| 10 |         2 | E          | Paid         |
| 11 |         3 | A          | N/A          |
| 12 |         3 | B          | N/A          |
| 13 |         3 | C          | N/A          |
| 14 |         3 | D          | Disabled     |
| 15 |         3 | E          | Paid         |
| 16 |         4 | A          | Included     |
| 17 |         4 | B          | Included     |
| 18 |         4 | C          | N/A          |
| 19 |         4 | D          | Disabled     |
| 20 |         4 | E          | Paid         |
| 21 |         5 | A          | N/A          |
| 22 |         5 | B          | N/A          |
| 23 |         5 | C          | Included     |
| 24 |         5 | D          | Disabled     |
| 25 |         5 | E          | Paid         |
----------------------------------------------

(软件)附加组件和设备之间存在多对多关系。多对多关系本身有一个属性选项_值,该值将是一组枚举的4个值(包括、不适用、付费或禁用(未测试))。 您也可以将此枚举设置为一个单独的选项值表,但这将是一种过度使用

因为这是一个多对多关系,我们需要一个三级表,它将有两个外键(FK)(一个复合外键)-一个FK是设备,第二个FK是插件。这个第三级表还有第三列选项_值,它是我们的关系属性,包含4个值作为其值集。我在下面画了一个小图来说明这个设计-


如果您必须使用代理id而不是复合主键,请至少在(设备id、加载项名称)上添加一个唯一约束。谢谢,非常简单。我不知道复合键,但它们做得很好。