Mysql SQL附加列或多对一关系

Mysql SQL附加列或多对一关系,mysql,sql,Mysql,Sql,我有一个产品实体,每个产品都有一个类型,比如说电话或笔记本电脑,所以最好用“类型”列创建产品实体: 或者仅为该类型创建一个表,并建立多对一关系: CREATE TABLE product ( id int PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, type_id INT NOT NULL, FOREIGN KEY (type_id) REFERENCES type(id) ) CREATE TA

我有一个产品实体,每个产品都有一个类型,比如说电话或笔记本电脑,所以最好用“类型”列创建产品实体:

或者仅为该类型创建一个表,并建立多对一关系:

CREATE TABLE product (
    id int PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    type_id INT NOT NULL,
    FOREIGN KEY (type_id) REFERENCES type(id)
)

CREATE TABLE type(
    id int PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(10) NOT NULL,
)

假设一个产品可以有多种类型,那么正确的关系是三个表。在您的情况下,您只有一种类型

第二种方法更好的原因是它使用适当的外键关系强制类型。因此,您不必担心一行是
“phone”
,另一行是
“phone”
。您有可用类型的显式列表


如果这是一个应用程序,那么这样的列表就更重要了,因为它直接输入到用户界面的元素中,您需要类型列表,例如选择列表。

如果您的产品只有一种类型,那么在额外的,通过引入额外的表格,不必要的复杂性。类型应该在同一个表中,在表中为varchar,在java中为enum,带有@Enumerated(String)注释

如果你有一对多的关系,那么你有两个实体,一个连接表是合适的?哪一个更符合逻辑且性能更好?这取决于“类型”在您的设计中的含义,如果它只是与产品一起显示的一个属性,则选择第一个解决方案,但如果它与某些业务逻辑关联,或者您认为您可能会将其扩展到名称之外,则选择第二个选项。
CREATE TABLE product (
    id int PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    type_id INT NOT NULL,
    FOREIGN KEY (type_id) REFERENCES type(id)
)

CREATE TABLE type(
    id int PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(10) NOT NULL,
)