SQL多个值,表设计

3
这更多是关于结构的问题,而不是编程语言本身。我对SQL只有非常基础的了解。
如果你有一个产品表,每个产品可以有多种颜色或没有颜色。
Table: Color
Columns: Id, ColorName

1, Black
2, White  
3, Purple  
4, Red

然后我们有:
Table: Phone
Columns: Id, PhoneName, PhoneManf, ColorID

例如,Phone Table可能有一款黑色和白色可用的HTC EVO手机。

这是否意味着每种手机的每种颜色都会有一条记录。

1, EVO, HTC, 1
2, EVO, HTC, 2
3, Curve, Blackberry,1
4, Curve, Blackberry,3

或者有没有一种方法,让每个电话只有一条记录,其中颜色键就像数组一样呢?

如果这是一个非常基础的问题,我很抱歉,我是新手,想确保我开始得正确。

5个回答

4

没有必要重复存储关键数据(如手机型号和制造商),只是因为它们在其他颜色下可用。

最好创建一个表格,如phone_color (IdPhone, IdColor)


在现实世界中,数据库的设计并非由了解规范化原则的人员完成,而是由那些在公司工作了20年、熟悉“业务”的人员完成。现在开始使用糟糕的数据库布局进行工作,这样才能获得真正的实战经验! - corsiKa
@glowcoder 是啊,很不幸我对此非常清楚。我们正在进行为期两个月的重构工作,因为一些[愤怒包容]人士[/愤怒包容]决定复制数据库记录以获取开始和结束日期,而不是在单个记录中使用两个字段。 - mdrg
按照这个正确的逻辑,我是否还应该有一个制造商对型号的查找表呢?还是应该保持现状?因为它更多的是一对多的关系?例如:三星生产Instinct、Epic等。 - patrick mc carrick
@ypercube: 谢谢,我是新手,有个快速问题,请原谅我的无知(我还在阅读所有这些)。关于(1对多)关系,为什么还需要一个查找表呢? - patrick mc carrick
假设您有一个名为Phone的表格,其中包含列Id、PhoneName和PhoneManf。然后在许多行中,PhoneManf('Ericsson'、'Nokia')等具有相同的值。这会带来很多问题,例如如果诺基亚更改名称为'SuperNokia'会发生什么?您必须更新所有(数百个)诺基亚手机的行。如果您想添加一个ManufAddress列会发生什么?等等... - ypercubeᵀᴹ
显示剩余3条评论

3

2
您可以创建另一个表格:
```html

您只需创建另一个表格:

```
Table: PhoneColor
Columns: PhoneId, ColorId

2

简单归一化

Table: Color
Columns: ColorId, ColorName
Primary Key: ColorId

// table for the many-to-many relationship
// between Colors and Phones
Table: PhoneColor
Columns: PhoneId, ColorId
Primary Key: (PhoneId, ColorId)
Foreign Key: PhoneId
Foreign Key: ColorId

Table: Phone
Columns: PhoneId, PhoneName, PhoneManfId
Primary Key: PhoneId
Foreign Key: PhoneManfId

Table: PhoneManf
Columns: PhoneManfId, PhoneManfName, PhoneManfAddress
Primary Key: PhoneManfId

关于手机的任何其他细节,例如SKU应该放在Phone表格中(或者如果您想这样称呼它,可以叫做Model)。

制造商的详细信息应该放在PhoneManf表格中等等。


谢谢,我会开始并看看我能做到什么 :)..期待着把这个简单的数据库解决掉。这是一个很好的学习经验。 - patrick mc carrick

0
我会创建一个名为phone_color的桥接表,其中包含一个电话列和一个颜色列。这些列存储相应的ID,映射多对多关系。
因此,根据上面的数据,您在桥接表中的行将是:
1,1
2,2
3,1
4,3

希望这有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接