在 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