如何在MySQL表中表示多值元素

时间:2015-02-05 01:03:20

标签: mysql database relational-database database-normalization

我正在努力寻找制作表格的最佳方法,消除冗余问题并使其模块化。

例如,假设我有以下表格:

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
}

我想创建一个新表,问题是值不是互斥的。

在表格中,我想要制作,我必须将公司(1)与一定数量的服务联系起来,问题是公司可以拥有(n)服务数量。

我想到了三种不同的方法,但我认为这3种模式违反了数据库规范化的规则。

下面我将编写3种不同的模式,以及一些示例记录:

NewTableOne(company_id, servs)
{
    1; 3,5,7,8
    3; 1,2,5
}

第一个记录意味着IBM公司提供电力,供暖,教育和运输服务。 第二个记录意味着亚马逊公司提供电话,燃气,供暖服务

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
}

使用这三种方式中的任何一种都很方便吗? 或者有更好的方法来做我想做的事情,如果有,怎么做?

感谢您的阅读,请原谅我的英语。

2 个答案:

答案 0 :(得分:2)

唯一会让您陷入困境的版本是#2。

  • 您不能选择所有提供电表#1的公司,而不会产生可怕的性能损失。 SO充满了诸如“如何通过CSV字段的单个值选择”这样的问题
  • 即使您还没有这么认为,您也会遇到#3的最大列限制。除此之外,添加服务还需要更改数据库结构,这不是一件好事。

答案 1 :(得分:1)

您提供的第二个解决方案是最好的,也很容易实现。它被称为Junction Table