sql - 使用单列表

标签 sql postgresql database-design surrogate-key

我正在创建一个数据库来存储从多个来源恢复的移动应用程序事件。问题是事件表中的行对用户没有太大意义,因为它主要是一连串的整数。迫使他们进行多个连接或多个查询。

CREATE TABLE source (
    id              serial PRIMARY KEY,
    value           string NOT NULL
); 

CREATE TABLE application (
    id              serial PRIMARY KEY,
    value           string NOT NULL
);

CREATE TABLE platform (
    id              serial PRIMARY KEY,
    value           string NOT NULL
);

CREATE TABLE country (
    id              serial PRIMARY KEY,
    value           string NOT NULL
);

CREATE TABLE event (
    id              serial PRIMARY KEY,
    source_id       integer REFERENCES source(id),
    application_id  integer REFERENCES application(id),
    platform_id     integer REFERENCES platform(id),
    country_id      integer REFERENCES country(id),

    ...

    updated_at      date NOT NULL,
    value           decimal(100, 2) NOT NULL
);

我想直接使用“辅助”表的值作为我将在事件表中引用的主键(因为它是唯一的而不是空的)。它看起来像这样:

CREATE TABLE source (
    value              string PRIMARY KEY
); 

CREATE TABLE application (
    value              string PRIMARY KEY
);

CREATE TABLE platform (
    value              string PRIMARY KEY
);

CREATE TABLE country (
    value              string PRIMARY KEY
);

CREATE TABLE event (
    id              serial PRIMARY KEY,
    source          string REFERENCES source(value),
    application     string REFERENCES application(value),
    platform        string REFERENCES platform(value),
    country         string REFERENCES country(value),

    ...

    updated_at      date NOT NULL,
    value           decimal(100, 2) NOT NULL
);

我认为这种方式可能也不错,因为在这种情况下我并没有真正看到使用代理键的附加值。还阻止我使用性能可能较慢的 View ,因为每次我在查询中使用 View 时它都会执行查询。

您如何看待这个选项?

最佳答案

“真正的”系统通常使用代理键。有多种原因:

  • 整数对于索引更有效,因为它们是固定长度的。
  • 整数对于外键引用更有效,因为它们只有四个字节(字符串通常更大)。
  • 字符串值可能会更改,然后需要更新引用表。
  • 自动生成的主键包含其他信息,例如插入顺序。
  • 最终用户不直接访问表。如果需要这样的功能,那么 View 就可以了。

本身使用字符串没有错。但实际上,它们并不用于此目的。

关于sql - 使用单列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43091746/

相关文章:

ruby-on-rails - 在 rails 中按日/月/年查询订单

hibernate - Grails-禁止访问org.hibernate.cfg.Environment错误

database - 何时使用一个字段而不是 2 个字段作为主键?

SQL COALESCE 处理 NULL + 1

MySQL 更新语句错误 - 截断不正确的 DOUBLE 值

python - 如何在 Django 中访问 table_name 变量?

sql - 在 SQL Server 中存储(产品)属性的最佳模式

c# - 如何通过 SSIS 中的主包在 TFS 上运行包?

MySQL只选择新记录

mysql - 根据时间间隔查询获取计数值