android 使用文本作为SQLite表中的主键不好?

yrwegjxp  于 2023-01-15  发布在  Android
关注(0)|答案(6)|浏览(219)

在SQLite数据库中使用文本作为主键是不是不好?我听说这是因为性能的原因,这是真的吗?在这种情况下,rowid会被用作实际的主键吗?

pgvzfuti

pgvzfuti1#

在SQLite数据库中使用文本作为主键是不是很糟糕?我听说这是因为性能原因,是真的吗?
从正确性的Angular 来看,TEXT PRIMARY KEY是正确的。
从性能的Angular 来看,首选INTEGER键,但是对于任何性能问题,您都应该自己测量一下,看看您的数据和用例是否有显著的差异。
在这种情况下,rowid是否将用作实际的主键?
只有INTEGER PRIMARY KEY可以使用ROWID的别名,其他类型的主键不会,并且除非指定WITHOUT ROWID,否则会有隐式整数rowid。参考。

4bbkushb

4bbkushb2#

在真实的世界中,如果我们讨论UUID,使用字符串作为主键有很多好处。能够在创建实体“passport”的那一刻准确地创建它可以极大地简化异步代码和/或分布式系统(如果我们讨论的是更复杂的移动的客户端/服务器架构)。
至于性能,当运行基准测试来执行10000次主键查找时,我没有发现任何可测量的差异,因为实际上,数据库索引在运行索引搜索时既不存储也不比较字符串。

8hhllhi2

8hhllhi23#

虽然本帖讨论的是INTEGER与TEXT主键,但上下文请参见2021年前后的Blob vs. Text for primary keys,SQLite创建者 Richard Hipp 回复了这篇文章。我已经粘贴并***强调了***他回复的相关部分。
(2)作者:Richard Hipp(drh)于2021-03-04 16:00:22回复1 [来源]
这两种方法都可以很好地工作,将散列存储为BLOB可能会稍微快一些,因为(正如您所观察到的)内容较少,因此文件I/O也较少。
化石版本控制系统做的事情与此非常相似。但是它将哈希值存储为***文本而不是blob。性能不是问题,而且文本对于开发人员来说在调试时更容易处理。***

v1l68za4

v1l68za44#

是的,如果您使用TEXT,则会获得android. database. sqlite. SQLiteConstraintException:UNIQUE约束失败:表名称.列名(代码1555)
SQLite有会话要插入,如果插入成功,则返回插入的最后一行的行ID。否则将返回-1。
returnMap到_ID,这就是为什么他们强制您为表接口BaseColumns
奇怪是,insert调用必须返回rowid,而不是布尔值之类的值
我希望SQLite中有文本主键功能

w1jd8yoj

w1jd8yoj5#

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

了解这一点可以让我们知道数字总是更具表演性(至少在我们今天的计算中)。

db2dz4w8

db2dz4w86#

在SQLite数据库中使用文本作为主键是不是很糟糕?我听说这是因为性能原因,是真的吗?
我从来没有听说过有人用 * 字符串作为表中的主键。对我来说(我真诚地希望其他人也是如此)非常**"丑陋"的实践**性能非常低。
如果你使用字符串作为主键,你需要考虑一些事情:

  • 3个符号的组合是否足够?
  • 或者我应该用5个符号?

在这里,每一行必须具有相同的格式(当然是可读性问题),并且是唯一的。哦!下面是 "小Pig工作"->,您需要创建一些 "唯一字符串生成器",它将生成unique 1字符串标识符2。
而且还有下一个问题是很好的考虑:

  • 更长的字符串=自动变得越来越难以比较
  • 表的大小急剧增加,因为很明显字符串比数字大得多
  • 行数--如果你的表可以有1000多行,那么使用字符串作为主键就太疯狂了

这是一个更复杂的主题,但我想说,好吧,对于非常小的表将有可能使用字符串作为主键(如果它有意义),但如果你会看看缺点,这是更好的技术使用数字作为主键肯定!

    • 结论是什么**

我不推荐你用字符串作为主键。它有更多的缺点作为优点(它真的有一些优点?)
使用数字作为主键要好得多(我不敢说是最好的)。
在这种情况下,rowid是否将用作实际的主键?
如果你将使用字符串作为主要的非。
1在实数中,字符串很少是唯一的。
2当然,您可以说您可以从row中的项的名称创建标识符,但这又是意大利面代码(项可以具有相同的名称)。

相关问题