在 SQLite 数据库中将文本作为主键是不是很糟糕?我听说由于性能原因这很糟糕,这是真的吗?在这种情况下,rowid 会被用作实际的主键吗?
5 回答
在 SQLite 数据库中将文本作为主键是不是很糟糕?我听说由于性能原因这很糟糕,这是真的吗?
从正确性的角度来看,TEXT PRIMARY KEY
是可以的。
从性能的角度来看,更喜欢INTEGER
按键。但与任何性能问题一样,请自行测量,看看您的数据和用例是否存在显着差异。
在这种情况下,rowid 会被用作实际的主键吗?
仅INTEGER PRIMARY KEY
与ROWID
. WITHOUT ROWID
其他类型的主键没有,除非指定,否则会有隐式整数 rowid 。参考。
在现实世界中,如果我们谈论 UUID,使用字符串作为主键有很多好处。能够在创建实体“护照”时准确地创建它可以大大简化异步代码和/或分布式系统(如果我们谈论的是更复杂的移动客户端/服务器架构)。
至于性能,我在运行基准以执行 10000 次主键查找时没有发现任何可测量的差异,因为实际上,数据库索引在运行索引搜索时既不存储也不比较字符串。
是的,如果你使用 TEXT 你会得到 android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: TableName.ColumnName (code 1555)
如果此插入成功,SQLite 具有插入会话并返回插入的最后一行的行 ID。否则将返回-1。
return 映射到 _ID ,这就是他们强制您为表连接 BaseColumns 的原因
奇怪的是插入调用必须返回rowid,而不是布尔值
我希望 SQLite 中有 TEXT PRIMARY KEY 功能
PRIMARY KEY 类型的字段意味着比较值。比较数字比比较文本更简单。
原因是64 位数值比较有特定的汇编指令。这总是比比较理论上可以无限大小的文本快得多。
比较数字的示例:
CMP DX, 00 ; Compare the DX value with zero
JE L7 ; If yes, then jump to label L7
.
.
L7: ...
在此处阅读有关CMP
组装说明的更多信息:https ://www.tutorialspoint.com/assembly_programming/assembly_conditions.htm
知道这一点让我们知道数字总是更具表现力(至少在我们今天拥有的计算中)。
在 SQLite 数据库中将文本作为主键是不是很糟糕?我听说由于性能原因这很糟糕,这是真的吗?
我从未听说有人使用字符串作为表中的主键。对我来说(老实说,我也希望对其他人)非常“丑陋”的做法,性能非常低。
如果您将使用字符串作为主键,则需要考虑“一些”事情:
- 3个符号的组合就够了吗?
- 还是应该使用 5 个符号?
在这里,每一行必须具有相同的格式(当然是可读性问题)并且也是唯一的。哦!这是下一个“小猪工作” ->
,您需要创建一些“唯一字符串生成器”,它将生成唯一的1字符串标识符2。
还有下一个问题值得考虑:
- 更长的字符串
=
会自动变得越来越难比较 - 表格的大小急剧增加,因为很明显字符串的大小比数字大得多
- 行数 - 如果你的表可以有 1000 多行,那么使用字符串作为主键是很疯狂的
这是更复杂的主题,但我想说好的,对于非常小的表可以使用字符串作为主键(如果它有意义的话)但是如果你会看到缺点,那么使用数字作为更好的技术肯定是主键!
什么是结论?
我不建议您使用字符串作为主键。它有更多的缺点作为优点(它真的有一些优点吗?)。
使用数字作为主键要好得多(我不敢说是最好的)实践。
在这种情况下,rowid 会被用作实际的主键吗?
如果您将字符串用作主要不是。
1在实际中,字符串很少是唯一的。
2当然,您可以说您可以从行中的项目名称创建标识符,但这又是意大利面条代码(项目可以具有相同的名称)。