我正在创建一个数据库来存储从多个来源恢复的移动应用的事件。问题是事件表中的行对用户没有多大意义,因为它主要是一系列整数。强制他们进行多个连接或多个查询。
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
);
我想过直接使用“secondary”表的值作为主键(因为它是唯一的而不是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
);
我认为这种方式也可能很好,因为在这种情况下我没有看到使用代理键的附加价值。同时也阻止我使用可能性能较慢的视图,因为每次我在查询中使用视图时都会执行查询。
您如何看待这个选项?
答案 0 :(得分:3)
"实"系统通常使用代理键。原因有多种:
使用字符串时,本身没有任何错误。但实际上,它们不是用于此目的。