Sql 没有唯一数据的表的主键

Sql 没有唯一数据的表的主键,sql,database,database-design,database-performance,Sql,Database,Database Design,Database Performance,我有两张像这样的桌子 Company( #id_company, ... ) addresses( address, *id_company*, *id_city* ) cities( #id_city, name_city, *id_county* ) countries( #id_country, name_country ) 我想要的是: 这是一个好的设计?(一家公司可以有多个地址) 重要的是,您注意到我没有为地址表添加PK,因为一家公司的每个地址都会不同,所以我说的对吗 我将永远

我有两张像这样的桌子

Company( #id_company, ... )

addresses( address, *id_company*, *id_city* )

cities( #id_city, name_city, *id_county* )

countries( #id_country, name_country )
我想要的是:

这是一个好的设计?(一家公司可以有多个地址)

重要的是,您注意到我没有为
地址
表添加
PK
,因为一家公司的每个地址都会不同,所以我说的对吗


我将永远不会有一个
,其中
中选择指定地址的

没关系-您可能希望在公司id上添加一些非唯一索引,以便加快公司地址查询。另一种选择是在公司和地址之间建立一个联接表,但这可能只有在地址存储了更多数据时才合理(因此搜索速度会较慢)。

没关系-您可能需要在公司id上添加一些非唯一索引,以便加快公司地址查询。另一种选择是在公司和地址之间建立一个联接表,但这可能只有在地址存储更多数据的情况下才是合理的(因此搜索速度会较慢)。

这种设计很好

(关系)表总是有一个(候选)键。(您可以选择其中一个作为主键,但候选键(也称为键)很重要。)因为如果小于所有列集合的列的子集都不是唯一的,则键就是所有列的集合

因为每个表都有一个,所以在SQL中应该声明它。例如,在SQL中,如果要声明对此表的键的外键约束,则必须声明该列,并通过主键、键或唯一键设置键。此外,告诉DBMS您所知道的有助于优化您对它的使用

确定键的关键是唯一列的子集,这些子集没有较小的唯一子集。那些是钥匙

A company, address or city is not unique since you are going to have multiple of each.
A (city,address) is not unique normally.
A (city,company) is not unique normally.
A (company,address) is not unique normally.
So (company,address,city) is the (only) (candidate) key.
请注意,如果只有一个城市,那么(公司、地址)将是关键。如果只有一家公司,那么(地址、城市)将是关键。因此,你给出的“因为一家公司的每个地址[+城市][?]都会不同”的理由并不合理,除非我们假设其他事情。

这个设计很好

(关系)表总是有一个(候选)键。(您可以选择其中一个作为主键,但候选键(也称为键)很重要。)因为如果小于所有列集合的列的子集都不是唯一的,则键就是所有列的集合

因为每个表都有一个,所以在SQL中应该声明它。例如,在SQL中,如果要声明对此表的键的外键约束,则必须声明该列,并通过主键、键或唯一键设置键。此外,告诉DBMS您所知道的有助于优化您对它的使用

确定键的关键是唯一列的子集,这些子集没有较小的唯一子集。那些是钥匙

A company, address or city is not unique since you are going to have multiple of each.
A (city,address) is not unique normally.
A (city,company) is not unique normally.
A (company,address) is not unique normally.
So (company,address,city) is the (only) (candidate) key.

请注意,如果只有一个城市,那么(公司、地址)将是关键。如果只有一家公司,那么(地址、城市)将是关键。因此,你给出的“因为一家公司的每个地址[+城市][?]都会不同”的理由并不合理,除非我们假设其他事情。

首先,我们应该区分自然键和技术键。至于自然键:

  • 一个国家的名称是唯一的
  • 一个城市可以通过它的国家和一个唯一的名字来唯一地识别。例如,德国有两个法兰克福。为了确保我们所谈论的是什么,我们要么使用不同的名称法兰克福/Main和法兰克福/order,要么使用城市名称及其邮政编码范围
  • 公司通常以全名来识别。或者使用一些税号,代码,等等
  • 为了唯一地识别公司地址,我们将采用公司加上国家、城市和城市地址(通常是街道名称和编号)
  • 您已决定使用技术密钥。没关系。但您仍然应该确保名称是唯一的。你不想让法国和法国出现在你的餐桌上,它只能出现一次。你也不希望法兰克福和法兰克福在你的德国城市表中没有任何区别。您不希望为一家公司输入两次相同的地址

    • 公司(#id#u company,name#u company,…)加上对name#u country或使公司独特的任何东西的唯一约束
    • 国家(#id_country,name_country)加上对name_country的唯一约束
    • 城市(#id#U城市、名称#U城市、id#U县)加上对名称#U城市、名称#U国家的唯一约束
    • 在所有三列上具有唯一约束的地址(地址、id_公司、id_城市)
    从您所说的来看,似乎您只需要查找地址。您不希望在任何其他表中使用它们,无论是现在还是将来。好吧,那你就完了。由于在所有三列上都需要一个唯一的约束,所以可以将其声明为主键,但不必这样做


    请记住,要在将来的任何其他表中引用公司地址,您必须在该表中存储address+id_company+id_city。在这一点上,您当然希望有一个地址id。但是你可以在需要的时候加上。现在你可以不用了。

    首先,我们应该区分自然键和技术键。至于自然键:

  • 一个国家的名称是唯一的
  • 一个城市可以通过它的国家和一个唯一的名字来唯一地识别。例如,德国有两个法兰克福。为了确保我们所谈论的是什么,我们要么使用不同的名称法兰克福/Main和法兰克福/order,要么使用城市名称及其邮政编码范围
  • 公司通常以全名来识别。或者使用一些税号,代码,等等
  • 为了唯一地识别公司地址,我们将采用公司加上国家、城市和城市地址(通常是街道名称和编号)
  • 您已决定使用技术密钥。没关系。但你还是应该