【发布时间】:2021-06-27 23:00:09
【问题描述】:
我目前正在就使用 text 列作为键的两种策略进行辩论。
第一个是简单地使用text 列本身作为键,例如:
create table a(
key_a text primary key,
)
create table b(
key_b text primary key,
)
create table c(
key_a text,
key_b text,
foreign key("key_a") references a("key_a"),
foreign key("key_b") references b("key_b")
)
我担心这会导致每个键都被复制,一次在 a 和 b 中,另一个在 c 中,因为 text 不是内联存储的。
我的第二种方法是使用前两个表上的 autoincrement id 作为主键,并使用表 c 上的这些 id 来引用它们,如下所示:
create table a(
id_a integer,
key_a text unique,
primary key("id_a" autoincrement)
)
create table b(
id_b integer,
key_b text unique,
primary key("id_a" autoincrement)
)
create table c(
id_a integer,
id_b integer,
foreign key("id_a") references a("id_a"),
foreign key("id_b") references b("id_b")
)
在第一种情况下我担心文本重复是否正确?或者sqlite 是否以某种方式实习这些并只为两者使用一个 id,类似于第二种策略的作用?
【问题讨论】:
-
这能回答你的问题吗? Using text as a primary key in SQLite table bad?。优化如何:您可以以纯文本形式打开数据库,并看到文本 FK 是按原样存储的。
-
@astentx 那里的答案主要集中在使用文本键的性能上,我正在查看字符串是否重复,我知道性能可能会受到轻微影响,但存储更多在我的用例中很重要。
标签: sql sqlite foreign-keys primary-key