在两个不同的表中使用一个主键作为两个外键

时间:2014-05-27 16:44:24

标签: mysql sql sql-server hibernate

我的要求是在省 - 语言和城市 - 语言之间建立许多关系。

所以我确实喜欢这个

 PK:身份证,     名称

语言 PK:身份证, 名称

Provinces_Languages province_id languages_id

同样适用于城市:

城市 PK:身份证, 名称

使用相同的语言表

Cities_Languages cities_id languages_id

现在,我想在省和城市之间建立一个ToMany / ManytoOne关系

PK:身份证, 名称

城市 PK:身份证, 名称

我在理解如何连接它们时遇到问题? 因为“id”已被 Provinces_Languages 用作外键。 和城市“id”也被 Cities_Languages 用作外键

请指导我如何链接这些实体?

2 个答案:

答案 0 :(得分:0)

没有问题 - 将<{1}}添加到您的城市表格中,并将其设为省级 .id的外键。

答案 1 :(得分:0)

您实际上可以将Provinces_LanguagesCities_Languages表合并为一个。只需添加type字段即可。请参阅以下示例(SQL Fiddle):

CREATE TABLE Provinces(id int auto_increment primary key, 
                       name varchar(100));

CREATE TABLE Cities(id int auto_increment primary key, 
                    name varchar(100),
                    prov_id int);

CREATE TABLE Languages(id int auto_increment primary key, 
                       name varchar(100));

CREATE TABLE ProvCity_Languages(provcity_id int, 
                                languages_id int,
                                type varchar(10));

INSERT INTO Provinces (name) VALUES
('Province1'),('Province2');

INSERT INTO Cities (name, prov_id) VALUES
('City1', 1),('City2', 1),('City3', 2),('City4', 2);

INSERT INTO Languages (name) VALUES
('English'),('Spanish'),('French'),
('Chinese'),('Pig Latin');

INSERT INTO ProvCity_Languages 
(provcity_id, languages_id, type) VALUES
(1, 1, 1),(1, 2, 1),(2, 1, 1),(1, 4, 2),
(2, 1, 2),(3, 1, 2),(3, 2, 2),(4, 5, 2),
(4, 4, 2),(4, 3, 2);

SELECT p.name AS ProvName, c.name AS CityName, 
       GROUP_CONCAT(DISTINCT pll.name SEPARATOR ', ') AS ProvLang,
       GROUP_CONCAT(DISTINCT cll.name SEPARATOR ', ') AS CityLang
FROM Provinces p
  JOIN Cities c on p.id = c.prov_id
  JOIN ProvCity_Languages pl on p.id = pl.provcity_id AND pl.type = 1 
  JOIN Languages pll on pl.languages_id = pll.id
  JOIN ProvCity_Languages cl on c.id = cl.provcity_id AND cl.type = 2
  JOIN Languages cll on cl.languages_id = cll.id
GROUP BY p.name, c.name

我展示了上面的SELECT查询,只是为了向您展示您可以对结果做任何您想做的事情。结果将类似于以下内容:

enter image description here