使用单列 table
Using single column table
我正在创建一个数据库来存储从多个来源恢复的移动应用程序事件。问题是事件 table 中的行对用户没有太大意义,因为它主要是一连串的整数。强制他们进行多个连接或多个查询。
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" table 的值作为我将在事件 table 中引用的主键(因为它是唯一的而不是 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
);
我认为这种方式可能也不错,因为在这种情况下我并没有真正看到使用代理键的附加值。还阻止我使用性能可能较慢的视图,因为每次我在查询中使用视图时它都会执行查询。
你觉得这个选项怎么样?
"real" 系统通常使用代理键。有多种原因:
- 整数对于索引更有效,因为它们是固定长度。
- 整数对于外键引用更有效,因为它们只有四个字节(字符串通常更大)。
- 字符串值可能会更改,因此需要更新引用表。
- 自动生成的主键包含其他信息,例如插入顺序。
- 最终用户不直接访问表。如果需要这样的功能,那么视图就可以了。
使用字符串 本身 没有任何错误。但实际上,它们并不用于此目的。
我正在创建一个数据库来存储从多个来源恢复的移动应用程序事件。问题是事件 table 中的行对用户没有太大意义,因为它主要是一连串的整数。强制他们进行多个连接或多个查询。
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" table 的值作为我将在事件 table 中引用的主键(因为它是唯一的而不是 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
);
我认为这种方式可能也不错,因为在这种情况下我并没有真正看到使用代理键的附加值。还阻止我使用性能可能较慢的视图,因为每次我在查询中使用视图时它都会执行查询。
你觉得这个选项怎么样?
"real" 系统通常使用代理键。有多种原因:
- 整数对于索引更有效,因为它们是固定长度。
- 整数对于外键引用更有效,因为它们只有四个字节(字符串通常更大)。
- 字符串值可能会更改,因此需要更新引用表。
- 自动生成的主键包含其他信息,例如插入顺序。
- 最终用户不直接访问表。如果需要这样的功能,那么视图就可以了。
使用字符串 本身 没有任何错误。但实际上,它们并不用于此目的。