【问题标题】:Is my foreign key usage correct? Or do I need a different query?我的外键使用正确吗?还是我需要不同的查询?
【发布时间】:2020-11-09 22:10:19
【问题描述】:

我将创建三个表。这些表属于一个类别名称。链接到“公司”类别的“部门”类别和链接到“部门”类别的“部门_单位”类别。用户将首先选择Company,然后选择department,然后选择department_unit。您认为我在下面写的查询正确吗?还是我需要编写一个不同的更好的查询? 非常感谢。

create_table_company= '''CREATE TABLE company(
ID SERIAL  PRIMARY KEY , 
NAME VARCHAR NOT NULL ,
); '''

create_table_department = '''CREATE TABLE department (
ID SERIAL  PRIMARY KEY , 
NAME VARCHAR NOT NULL ,
company_id BIGINT, 
FOREIGN KEY(company_id) REFERENCES COMPANY(id)); '''

create_table_department_unit = '''CREATE TABLE department_unit(
ID SERIAL  PRIMARY KEY , 
NAME VARCHAR NOT NULL ,
department_id BIGINT,
FOREIGN KEY(department_id) REFERENCES DEPARTMENT(id)); '''

【问题讨论】:

  • 您的代码看起来不错。你有什么具体问题吗?
  • 恐怕在性能方面。如果我在最后一个表中保存其他表外键。我将在单个表上进行查询。但是,这样一来,我会同时在 3 个表中运行查询。我不明白哪个是对的
  • 建议稍作调整(恕我直言)。您的所有 ID 都定义为序列号。 Serial 是将列定义为 integer 的快捷方式,创建一个整数序列并将该序列设为默认值。您的 FK 被定义为 bigint。并不是该设置不可行或有错误。然而,一致性很重要。我会将 ID 更改为 Bigserial 或将 FK 更改为整数。更好的是,如果您使用的是 v10 或更高版本,请将 ID 更改为 Generated as Identity 列。

标签: python sql postgresql psycopg2


【解决方案1】:

这个数据模型看起来不错。

当您需要属于某个部门单位的公司名称时,不必担心必须连接三个表:数据库已针对此类连接进行了优化。对于 OLTP 工作负载(您总是只从表中选择几行),这可以通过 嵌套循环连接 非常有效地处理。

您的架构中唯一缺少的是两个索引:

CREATE INDEX ON department (company_id);
CREATE INDEX ON department_unit (department_id);

需要这些索引

【讨论】:

    猜你喜欢
    • 2015-04-23
    • 2021-10-24
    • 1970-01-01
    • 2011-04-17
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    相关资源
    最近更新 更多