简单人车示例的sql关系模型查询

j2qf4p5b  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(283)

我想了解一下我为postgresql创建的关系模型。这与人和车的关系有关。

CREATE TABLE "person" (
"id" serial NOT NULL PRIMARY KEY,
"name" varchar(300) NOT NULL,
"car_id" integer REFERENCES car (id));

CREATE TABLE "car" (
"id" serial NOT NULL PRIMARY KEY,
"type" varchar(50) NOT NULL);

 CREATE TABLE "car_person_relations" (
"id" serial NOT NULL PRIMARY KEY,
"car_type" varchar(50) NOT NULL REFERENCES "car" ("type"),
"person_id" integer NOT NULL REFERENCES "person" ("id"));

最终,我想根据有多少人拥有它来得到最流行的车型,也就是说,它与多少“人”有关。我可以使用什么查询来实现这一点?这是关系表吗( car_person_relations )足以实现吗?
如有任何见解,将不胜感激

z8dt9xmd

z8dt9xmd1#

如果我理解正确,这是一个简单的聚合,有一些限制:

select car_type, count(*) as num_persons
from car_person_relations cpr
group by car_type
order by count(*) desc
limit 1;
sc4hvdpw

sc4hvdpw2#

首先看看您的数据模型,它有几个基本问题。在car\u persons\u relations表中,您正试图在car\u类型上创建一个fk。但是,要做到这一点,car\u type必须在car表中是唯一的。来自文件第5.4.5节。外键。
外键约束指定一列(或一组列)中的值必须与另一个表的某一行中出现的值匹配。我们说这保持了两个相关表之间的引用完整性。。。外键必须引用作为主键或形成唯一约束的列。
但这意味着表中给定类型只能有一辆车。
现在看看person表。此表包含一个fk to car\u id,从而建立一个m:1 to car。基本上这种关系说“一个人只能拥有一辆车,但是一辆车可以被很多人拥有”。您的描述和表名表明这不是您试图定义的关系。
更正需要进行以下更改:
将车号添加到车人关系中。
从人身上取下车号。
从car\u person\u关系中删除car\u type。
将car\u person\u关系pk重新定义为car\u id,person\u id。
或者离开代理pk,在car\u id,person\u id)上创建uk。
创建从car\u person\u关系到car和person的fks。
修正模型

create table person (
   id   serial       
  ,name varchar(300) not null
  ,constraint person_pk primary key (id) 
);

create table car (
   id serial  
  ,type varchar(50) not null
  ,constraint car_pk primary key (id)  
  );

create table car_person_relations (
   car_id    integer   
  ,person_id integer 
  ,constraint car_person_relations primary key (car_id, person_id)
  ,constraint car_person_relations_2_car_fk
              foreign key (car_id) 
              references  (car.id)
  ,constraint car_person_relations_2_person_fk
              foreign key (person_id) 
              references  (person.id)
):

然后必要的查询变成:

select cpr.car_type, count(*) as num_persons
  from car_person_relations cpr
  join car                  c
    on cpr.car_id = c.id 
 group by cpr.car_type
 order by count(*) desc
 limit 1;

相关问题