如何 normalize/decompose 包含多个重复选项字段的 table

How to normalize/decompose a table that contains several repeated option fields

假设我有 table 来自不同供应商的电机,以及电机成本和选项成本,以及特定电机中是否存在特定选项。

如何在 SQL (MySQL) 中最好地构建它?

示例Table:

motor
------------ 
id
model
listprice
price
cost_base //base cost of motor
position
weight
option_1_present //does option1 exist on the motor?
option_1_cost    //cost of option1 if it is selected by the user
option_2_present
option_2_cost
option_3_present
option_3_cost
option_4_present
option_4_cost
option_5_present
option_5_cost
option_6_present
option_6_cost

除了标准化之外,我很好奇是否应该根据 "cost" 和 "presence" 因素将字段分解为单独的 tables。

到目前为止,这个设计对我有用,即根据客户偏好(即选项 1、3),我将查看数据库以 select 具有这些选项的电机然后来涨价

这么说 SELECT * from motor where option_1_present=1 and option_3_present=1 然后把费用加起来。

问题

是否有任何 normalization/decomposition 任务要用这个 table 完成?

您违反了数据库设计的基本规则。您没有确认第一范式 1NF。

As per First Normal Form, no two Rows of data must contain repeating group of information i.e each set of column must have a unique value, such that multiple columns cannot be used to fetch the same row. Each table should be organized into rows, and each row should have a primary key that distinguishes it as unique.

Database Normalization

相反,你应该分解(特别是因为你已经指出可能添加了选项)你的选项存在 presence table 并在存在和存在之间添加一个桥梁 table马达.

motor
------------ 
id
model
listprice
price
cost_base //base cost of motor
position
weight

bridge
--------
bridgeid
motorid
presenceid

presence
------------ 
presenceid
option
cost

这样你就没有你的存在选项在电机中重复成本等 table。如果你想添加另一个选项,它不需要锁定来重建一个大的 table,因为存在 table 在任何给定时间都只会有一些记录。 bridge table 会告诉你对于用户指定的电机有什么选项。基本上将所有数据从水平变为垂直。您的查询必须变得更复杂一些,但这是一种更简洁、更具可扩展性的方法。