在 MySQL table 中表示多值元素的方法
Ways to represent multivalued elements in MySQL table
我正在努力寻找制作 table 的最佳方法,消除冗余问题并使其模块化。
例如,假设我有以下 tables:
Company(id, name)
{
1; IBM
2; Google
3; Amazon
}
Services(id, name)
{
1; Phone
2; Gas
3; Electricity
4; Water
5; Heating
6; Health service
7; Education
8; Transport service
}
我想做一个新的table,问题是值不互斥
在table中,我要制作,我必须将公司(1)与一定数量的服务联系起来,问题是公司可以有 (n) 个服务。
我想到了三种不同的方式来做,但是我认为这三种方式违反了数据库规范化的规则。
下面我将写出3种不同的模式,并记录一些例子:
NewTableOne(company_id, servs)
{
1; 3,5,7,8
3; 1,2,5
}
第一条记录表示IBM公司有电力、供暖、教育和运输服务等服务。
第二条记录表示公司 Amazon 有 Phone、Gas、Heating
的服务
NewTableTwo(company_id, service)
{
1; 3
1; 5
1; 7
1; 8
2; 1
2; 2
2; 5
}
最后一个,
NewTableThree(id, phone, gas, elect, water, heating, health, edu, transport)
{
1; 0; 0; 1; 0; 1; 0; 1; 1
2; 1; 1; 0; 0; 1; 0; 0; 0
}
这3种方式用哪一种方便?
或者有没有更好的方法来做我想做的事情,如果有,怎么做?
感谢阅读,请原谅我的英语。
唯一不会给您带来可怕麻烦的版本是#2。
- 您不可能 select 所有提供电力表格 #1 的公司都不会受到可怕的性能损失。 SO充满了诸如"how do I select by a single value of a CSV field"
之类的问题
- 您将 运行 进入 #3 的最大列限制,即使您还没有这么想。除此之外,添加服务需要更改数据库结构,这不是一件好事。
您提供的第二个解决方案是最好的且易于实施。它被称为 Junction Table
我正在努力寻找制作 table 的最佳方法,消除冗余问题并使其模块化。
例如,假设我有以下 tables:
Company(id, name)
{
1; IBM
2; Google
3; Amazon
}
Services(id, name)
{
1; Phone
2; Gas
3; Electricity
4; Water
5; Heating
6; Health service
7; Education
8; Transport service
}
我想做一个新的table,问题是值不互斥
在table中,我要制作,我必须将公司(1)与一定数量的服务联系起来,问题是公司可以有 (n) 个服务。
我想到了三种不同的方式来做,但是我认为这三种方式违反了数据库规范化的规则。
下面我将写出3种不同的模式,并记录一些例子:
NewTableOne(company_id, servs)
{
1; 3,5,7,8
3; 1,2,5
}
第一条记录表示IBM公司有电力、供暖、教育和运输服务等服务。 第二条记录表示公司 Amazon 有 Phone、Gas、Heating
的服务NewTableTwo(company_id, service)
{
1; 3
1; 5
1; 7
1; 8
2; 1
2; 2
2; 5
}
最后一个,
NewTableThree(id, phone, gas, elect, water, heating, health, edu, transport)
{
1; 0; 0; 1; 0; 1; 0; 1; 1
2; 1; 1; 0; 0; 1; 0; 0; 0
}
这3种方式用哪一种方便? 或者有没有更好的方法来做我想做的事情,如果有,怎么做?
感谢阅读,请原谅我的英语。
唯一不会给您带来可怕麻烦的版本是#2。
- 您不可能 select 所有提供电力表格 #1 的公司都不会受到可怕的性能损失。 SO充满了诸如"how do I select by a single value of a CSV field" 之类的问题
- 您将 运行 进入 #3 的最大列限制,即使您还没有这么想。除此之外,添加服务需要更改数据库结构,这不是一件好事。
您提供的第二个解决方案是最好的且易于实施。它被称为 Junction Table