sql - PostgreSQL 链接表

标签 sql postgresql entity-relationship

<分区>

我有这个七表数据库,用于存储具有历史值(value)的区域(例如旧墓地或石器时代的房屋遗址),这些区域可以划分为子区域。对这些区域进行了检查和挖掘。区域、子区域、检查、挖掘四张表,都可以有一个或多个“定位”或“发现”。

Location-tables 和finding-tables 目前与link-table 相关,其中包含目标表的名称和该表中的目标id,例如target_table="subarea", target_id=5.

问题是在数据库中存储表名在我看来不是好的做法。那么,将具有 N-1 关系的位置和查找链接到四个表中的任何一个的最佳解决方案是什么?

最佳答案

有很多不同的方法可以做到这一点。我的解决方案使用了 PostgreSQL 的一些有争议的功能,因此请参阅下面的注意事项。

CREATE TABLE link_categories (
    id int not null unique,
    label text primary key
);

INSERT INTO link_categories(id, label)
VALUES (1, 'Area'), 
       (2, 'Sub-area'),
       (3, 'Inspection'),
       (4, 'Excavation');

CREATE TABLE location_base (
   -- add your base fields here
   link_category int not null,
   refkey bigint not null -- assume all id's on the other tables are bigints?
);

CREATE TABLE finding_base (
  -- add your base fields here
   link_category int not null,
  refkey bigint not null -- see above
);

然后我会使用表继承来创建子表,以管理您的多态关联。

CREATE TABLE location_area (
   CHECK (link_category = 1),
   FOREIGN KEY (refkey) REFERENCES area(id),
   PRIMARY KEY (...) -- needs to be repeated for each child table
) INHERITS (location_base);

CREATE TABLE location_subarea (
   CHECK (link_category = 2),
   FOREIGN KEY (refkey) REFERENCES subarea(id),
   PRIMARY KEY (...) -- needs to be repeated for each child table
) INHERITS (location_base);

等重复结果表

请注意,表继承在 PostgreSQL 上是一个颇具争议的特性。您需要考虑利用表继承的一些潜在怪癖来发挥您的优势,并像表分区系统一样实现它。请注意,在这种情况下,link_category 基本上成为主键的一部分。

然而,在您使用此解决方案之前,请阅读 PostgreSQL 文档:

请注意,这是一个有点危险的特性,但多态关联通常会带来危险。我在这里特别推荐这个,因为我认为它可以简化您的失败案例,即使这样做是以其他一些事情为代价的。

关于sql - PostgreSQL 链接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12684981/

相关文章:

sql - 我可以在包含 NVARCHAR(MAX) 字段的表上放置聚集列存储索引吗?

sql - ORA-00917 在 sql 查询中转义撇号

postgresql - 无法使用 pgAdmin 将 PostgreSQL 连接到远程数据库

c# - Entity Framework 4.1 幽灵列

php - 检索与输入的用户名匹配的所有用户的最后一条消息

MySQL 从最高到最低的匹配排名的最佳方法是什么?

java - 没有用于带有 JavaSE 应用程序的 EntityManager 的持久性提供程序?

c++ - 使用 pqxx 编译程序时出现问题

iphone - 是否可以在Core Data中自动删除未引用的对象?

c# - 在 Entity Framework 中是否有更简单的方法将关系分配给新对象?