我想了解一下我为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
)足以实现吗?
如有任何见解,将不胜感激
2条答案
按热度按时间z8dt9xmd1#
如果我理解正确,这是一个简单的聚合,有一些限制:
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。
修正模型
然后必要的查询变成: