首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在数据库中实现这一点?

如何在数据库中实现这一点?
EN

Stack Overflow用户
提问于 2014-12-03 16:10:16
回答 1查看 89关注 0票数 0

我是数据库新手,但我遇到了一个问题:

这里是AAA、BBB、TABLE-1、TABLE-2和TABLE-3表名称(表)。

代码语言:javascript
复制
TABLE-1 (A,   B) COMPOUND PRIMARY KEY(A,B) AND A IS REFER FROM *AAA(A)* AND B IS REFER FROM *BBB(B)*
         1    1
         1    2
         2    1

TABLE-2 (D,   A) D IS PRIME AND A IS REFER FROM *AAA(A)*
         1    1
         2    2

TABLE-3 (D,   B) COMPOUND PRIMARY KEY(D,B) AND B IS REFER FROM *BBB(B)*
         1    1
         2    2

HERE MEANING OF TABLE-2 AND TABLE-3 IS 
(D,   A,   B)
 1    1    1
 2    2    2

但问题在第二行,这里A= 2,B=2与表1不匹配。

如何做到这一点?

例如:

代码语言:javascript
复制
    I have Airport, Caterer, Meal, Airport_caterer_map, Airport_Meal_Map
    Airport (this main configuration table)
    id     Name
     1      aaa
     2      bbb
    Caterer   (this main configuration table)
    id     Name
     1      mmm
     2      nnn

    Airport_caterer_map  (this main configuration table)
    airport_id     caterer_id
    1                1
    1                2
    2                1

    Meal
    id     Name  caterer_id
     1      mmm  1
     2      nnn  2

    Airport_Meal_Map
    mail_id    airport_id
    1          1
    1          2
    2          1
    2          2   -- This row should be wrong. 

why is, 
   1. meal 2 is available in airport 2
   2. meal 2 is providing by caterer 2
   3. But there is no mapping between caterer 2 and airport 2 in airport_caterer_map table.
EN

回答 1

Stack Overflow用户

发布于 2014-12-06 04:40:14

基本上,您的Airport_Meal_Map实际上应该是一个Airport_Caterer_Meal_Map -如果您希望数据库帮助进行一致性检查:

代码语言:javascript
复制
CREATE TABLE Airport
  (
   id INT primary key,
   name VARCHAR(30)
  );

INSERT INTO Airport VALUES
(1, 'aaa'),
(2, 'bbb');

CREATE TABLE Caterer
  (
   id INT primary key,
   name VARCHAR(30)
  );

INSERT INTO Caterer VALUES
(1, 'mmm'),
(2, 'nnn');

CREATE TABLE Airport_Caterer_Map
  (
   airport_id INT,
   caterer_id INT,
   PRIMARY KEY (airport_id, caterer_id),
   FOREIGN KEY (airport_id) REFERENCES Airport(id),
   FOREIGN KEY (caterer_id) REFERENCES Caterer(id)
  );

INSERT INTO Airport_Caterer_Map (airport_id, caterer_id) VALUES
(1, 1),
(1, 2),
(2, 1);

-- INSERT INTO Airport_Caterer_Map (airport_id, caterer_id) VALUES
-- (2, 2);

CREATE TABLE Meal
  (
   id INT,
   name VARCHAR(30),
   caterer_id INT,
   PRIMARY KEY (id, caterer_id),
   FOREIGN KEY (caterer_id) REFERENCES Caterer(id)
  );

INSERT INTO Meal (id, name, caterer_id) VALUES
(1, 'mmm', 1),
(2, 'nnn', 2);

-- INSERT INTO Meal (id, name, caterer_id) VALUES
-- (1, 'mmm', 2);

-- INSERT INTO Meal (id, name, caterer_id) VALUES
-- (2, 'nnn', 1);

CREATE TABLE Airport_Meal_Map -- actually Airport_Caterer_Meal_Map
  (
   meal_id INT,
   airport_id INT,
   caterer_id INT,
   PRIMARY KEY (meal_id, airport_id, caterer_id),
   FOREIGN KEY (airport_id, caterer_id) REFERENCES Airport_Caterer_Map(airport_id, caterer_id),
   FOREIGN KEY (meal_id, caterer_id) REFERENCES Meal(id, caterer_id)
  );

INSERT INTO Airport_Meal_Map (meal_id, airport_id, caterer_id) VALUES
(1, 1, 1),
(1, 2, 1),
(2, 1, 2);

-- Fails as meal 1 is not prepared by caterer 2
-- INSERT INTO Airport_Meal_Map (meal_id, airport_id, caterer_id) VALUES
-- (1, 1, 2);

-- Fails as meal 2 is not prepared by caterer 1
-- INSERT INTO Airport_Meal_Map (meal_id, airport_id, caterer_id) VALUES
-- (2, 1, 1);

-- Fails as airport 2 is not served by caterer 2
-- INSERT INTO Airport_Meal_Map (meal_id, airport_id, caterer_id) VALUES
-- (2, 2, 2);

SQL Fiddle

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27266594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档