热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用文本作为SQLite表的主键不好吗?-UsingtextasaprimarykeyinSQLitetablebad?

IsitbadtohavetextasaprimarykeyinanSQLitedatabase?Iheardthatitsbadforperformance

Is it bad to have text as a primary key in an SQLite database? I heard that it's bad for performance reasons, is this true? And will the rowid be used as the actual primary key in such a case?

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

3 个解决方案

#1


-7  

Is it bad to have text as a primary key in an SQLite database? I heard that it's bad for performance reasons, is this true?

将文本作为SQLite数据库的主键是否不好?我听说这是不好的表现,这是真的吗?

I never heard that somebody used string as primary key in table. For me (and I honestly hope also for others) very "ugly" practise with very low performance.

我从来没听说过有人用字符串作为表中的主键。对我来说(我也真诚地希望其他人也能)非常“丑陋”的练习表现很差。

If you'll use string as primary key you needs to think about a "few" things:

如果你要使用字符串作为主键,你需要考虑一些事情:

  • Will be combination of 3 symbols enough?
  • 3个符号组合够吗?
  • Or should I use 5 symbols?
  • 或者我应该用5个符号?

Here, each row must have same format (readability issue of course) and also be unique. Oh! Here is next "piggy work" -> you'll need to create some "unique string generator" that will generate unique1 string identificator2.

在这里,每一行必须具有相同的格式(当然是可读性问题),并且也是唯一的。哦!下面是下一个“piggy work”—您需要创建一些“唯一的字符串生成器”来生成unique1字符串标识符2。

And also there are next issues is good to consider:

而且还有下一个问题值得考虑:

  • Longer strings = automatically harder and harder to compare
  • 较长字符串=自动比较难比较。
  • Size of table radically raises because it's pretty clear that string has much more size as number
  • 表的大小从根本上提高了,因为很明显,字符串的大小更大。
  • Number of rows - it's madness to use string as primary key if you table can have 1000+ rows
  • 行数——如果表可以有1000+行,那么使用字符串作为主键就太疯狂了

It's more complex theme but i would like to say that OK, for very small tables would be possible to use strings as primary key (if it makes a sence) but if you'll look at disadvantages it's much more better technique to use number as primary key for sure!

这是一个更复杂的主题,但是我想说,好吧,对于非常小的表来说,可以使用string作为主键(如果它会产生一个sence),但是如果您看到它的缺点,那么使用number作为主键肯定会更好!

And what is conclusion?

结论是什么呢?

I don't recommend you to use string as primary key. It has more disadvantages as advantages (it has really some advantage?).

我不建议您使用string作为主键。它有更多的缺点作为优点(它真的有一些优点吗?)

Usage of number as primary key is much more better (I'm scared to say the best) practise.

使用数字作为主键更好(我不敢说最好)。

And will the rowid be used as the actual primary key in such a case?

在这种情况下,rowid会被用作实际的主键吗?

If you will use string as primary not.

如果你将字符串作为主不。

1In real strings are rarely unique.

在真正的字符串中,很少是唯一的。

2Of course, you could say that you can create identificator from name of item in row, but it's once again spaghetti code (items can have same name).

当然,你也可以说你可以根据项目的名称来创建标识符,但是它还是意大利面条式的代码(项目可以有相同的名称)。

#2


15  

Is it bad to have text as a primary key in an SQLite database? I heard that it's bad for performance reasons, is this true?

将文本作为SQLite数据库的主键是否不好?我听说这是不好的表现,这是真的吗?

From correctness point of view, TEXT PRIMARY KEY is all right.

从正确性的角度来看,文本主键是可以的。

From performance point of view, prefer INTEGER keys. But as with any performance issue, measure it yourself to see if there's a significant difference with your data and use cases.

从性能的角度来看,更喜欢整数键。但是与任何性能问题一样,您自己度量它,看看您的数据和用例是否有显著的差异。

And will the rowid be used as the actual primary key in such a case?

在这种情况下,rowid会被用作实际的主键吗?

Only INTEGER PRIMARY KEY gets aliased with ROWID. Other kinds of primary keys don't, and there will be the implicit integer rowid unless WITHOUT ROWID is specified. Reference.

只有整数主键使用ROWID进行别名。其他类型的主键没有,并且会有隐式整数rowid,除非没有指定rowid。参考。

#3


6  

In real world, using strings as primary key has a lot of benefits if we are talking about UUIDs. Being able to create entity "passport" exactly at the moment of its creation can massively simplify asynchronous code and/or distributed system (if we are talking about more complex mobile client / server architecture).

在现实世界中,如果我们讨论uuid,使用字符串作为主键有很多好处。能够在创建实体时创建“passport”,可以极大地简化异步代码和/或分布式系统(如果我们讨论的是更复杂的移动客户端/服务器架构)。

As to the performance, I did not find any measurable difference when running a benchmark to perform 10000 primary key lookups, as in reality, database indexes neither store nor compare strings when running indexed searches.

至于性能,我在运行基准测试执行10000个主键查找时没有发现任何可测量的差异,实际上,数据库索引在运行索引搜索时既不存储也不比较字符串。


推荐阅读
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 本文详细解析了 Yii2 框架中视图和布局的各种函数,并综述了它们在实际开发中的应用场景。通过深入探讨每个函数的功能和用法,为开发者提供了全面的参考,帮助他们在项目中更高效地利用这些工具。 ... [详细]
  • 提升视觉效果:Unity3D中的HDR与Bloom技术(高动态范围成像与光线散射)
    提升视觉效果:Unity3D中的HDR与Bloom技术(高动态范围成像与光线散射) ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 在《ChartData类详解》一文中,我们将深入探讨 MPAndroidChart 中的 ChartData 类。本文将详细介绍如何设置图表颜色(Setting Colors)以及如何格式化数据值(Formatting Data Values),通过 ValueFormatter 的使用来提升图表的可读性和美观度。此外,我们还将介绍一些高级配置选项,帮助开发者更好地定制和优化图表展示效果。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
author-avatar
手机用户2602929123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有