首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >让int联接而不是字符串列更好吗?

让int联接而不是字符串列更好吗?
EN

Stack Overflow用户
提问于 2013-11-13 13:40:13
回答 5查看 2.9K关注 0票数 3

假设我有一个具有状态的用户,用户的状态可以是“活动的”、“暂停的”或“非活动的”。

现在,在创建数据库的时候,我在想.如果使用字符串值(使用枚举类型或应用规则)的列更好,那么查询和了解当前用户状态更容易,或者更好地连接,我应该加入一个包含可能的用户状态的UserStatuses表吗?

假设,应用程序用户当然不能创建状态。

编辑:澄清

  1. 我将不使用使用字符串联接,它将是到UserStatuses PK的int联接。
  2. 我最关心的是性能
  3. 可能的状态是静态的永远不会改变
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-11-13 13:44:37

在大多数系统上,它对性能几乎没有影响。就我个人而言,为了清晰起见,我会使用一个短字符串,并按照您的建议将其加入到一个包含更多细节的表中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table intLookup
(
pk integer primary key,
value varchar(20) not null
)
insert into intLookup (pk, value) values
(1,'value 1'),
(2,'value 2'),
(3,'value 3'),
(4,'value 4')

create table stringLookup
(
pk varchar(4) primary key,
value varchar(20) not null
)

insert into stringLookup (pk, value) values
(1,'value 1'),
(2,'value 2'),
(3,'value 3'),
(4,'value 4')



create table masterData
(
stuff varchar(50),
fkInt integer references intLookup(pk),
fkString varchar(4)references stringLookup(pk)
)
create index i on masterData(fkInt)
create index s on masterData(fkString)

insert into masterData
(stuff, fkInt, fkString)
select COLUMN_NAME, (ORDINAL_POSITION %4)+1,(ORDINAL_POSITION %4)+1 from INFORMATION_SCHEMA.COLUMNS
go 1000

这将导致300 K行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
*
from masterData m inner join intLookup i on m.fkInt=i.pk

select 
*
from masterData m inner join stringLookup s on m.fkString=s.pk

在我的系统( Server)上-查询计划、I/O和CPU是相同的-执行时间是相同的。-只读取和处理一次查找表(在这两个查询中)

使用int或string没有区别。

票数 2
EN

Stack Overflow用户

发布于 2013-11-13 14:30:34

我认为,作为一个整体,每个人都找到了你问题答案的重要组成部分。但是,它们都有好的方面,应该放在一起,而不是分开。

  1. 正如生理学家所提到的,正常的标准化通常被认为是为了提高性能。然而,与逻辑学家不同的是,我认为你的情况是正常化的最佳时机。你的问题似乎是正常化问题。在这种情况下,使用Santhosh建议的数字键(然后返回包含状态解码的代码表)将导致每个记录存储的数据减少。这种差异不会显示在一个小型Access数据库中,但它可能会显示在一个拥有数百万记录的表中,每个记录都具有状态。
  2. 正如David所建议的那样,您可能会发现,将这个特定的数据点正常化将导致更受控制的最终用户体验。正常化状态字段还将允许您在稍后的某个位置编辑状态标志,并使该更改在整个数据库中永久化。如果您的老板和我的一样,那么您可能不得不将非活动状态更改为关闭状态(然后在下周再次返回),如果状态字段没有规范化,这将是更多的工作。通过规范化,还可以更容易地执行引用完整性。如果状态键不在状态代码表中,则无法将其添加到主表中。
  3. 如果您担心将来查询时的性能,那么有一些不同的事情要考虑。要回退状态,如果它是规范化的,您将向查询添加一个联接。在任何大小的记录集中,该连接可能不会对您造成伤害,但我相信它将通过限制必须处理的原始文本的数量来帮助更大的记录集。如果您主要关心的是查询数据时的性能,下面是关于如何优化查询的一个很好的资源:http://www.sql-server-performance.com/2007/t-sql-where/和我认为您会发现这里讨论的许多规则也将适用于在联接本身中强制执行的任何包含条件。

希望这能有所帮助!

克里斯托弗

票数 2
EN

Stack Overflow用户

发布于 2013-11-13 13:56:19

标准化背后的整个想法是防止数据重复(至少有一个概念)。

在这种情况下,用户一次只能拥有1种状态(我假设),所以他们没有理由将其放在自己的表中。你只会把事情复杂化。如果由于某种原因,这些状态不是静态的,那么您将有一个独立的表的唯一原因。意思是下个月你可以加上“有点活跃”和“可能不活跃”。这意味着,如果您没有将代码放在自己的表中,则需要更改代码以弥补这一点。您可以创建一个维护页面,用户可以在其中添加状态,然后需要创建一个独立的表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19964943

复制
相关文章
[原创]Fluent NHibernate之旅(四)-- 关系(上)
经过了前面三篇的介绍,相信大家对Fluent NHibernate已经有一定的了解了,在我们学习中,Fluent 也已经进入了RTM版本。这次的版本发布离RC版只有半个月不到,修正了很多bug,同时补充了大量的功能,在每天更新中,也看到了大量的单元测试,我们相信Fluent NHibernate 已经相对稳定成熟了。RTM相对于RC版本来说,使用方法没有太大的变化,所以不做讲解。 我们后面的教程,会使用RTM版本来演示,希望大家能及时更新(点击下载最新版)。 Fluent NHibernate之旅系列导航
脑洞的蜂蜜
2018/02/02
1.2K0
[原创]Fluent NHibernate之旅(四)-- 关系(上)
ViewStub延迟加载
在项目中,难免会遇到这种需求,在程序运行时需要动态根据条件来决定显示哪个View或某个布局,最通常的想法就是把需要动态显示的View都先写在布局中,然后把它们的可见性设为View.GONE,最后在代码中通过控制View.VISIABLE动态的更改它的可见性。这样的做法的优点是逻辑简单而且控制起来比较灵活。但是它的缺点就是,耗费资源,虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源。
全栈程序员站长
2022/09/13
1.6K0
ViewStub延迟加载
mybatis 延迟加载(懒加载)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
多凡
2019/11/01
2.1K0
图片延迟加载
官网:http://www.appelsiini.net/projects/lazyload 使用例子:http://demo.phpfs.com/lazyload/ 代码下载:lazyload 代码解析 $(function(){ var ERROR_IMG = './img/image_err.gif'; var LOADER_IMG = './img/lazy_loading.gif'; $("img").one("error", function() { $(this).attr("src
苦咖啡
2018/05/08
2.2K0
Hibernate延迟加载
上一篇文章我们学习了Hibernate的多表关联关系,这里就涉及到一个很实用的概念:延迟加载或者也叫惰性加载,懒加载。使用延迟加载可以提高程序的运行效率。Java程序与数据库交互的频次越低,程序运行效率越高,所以我们应该尽量减少Java程序与数据库的交互次数,Hibernate延迟加载就很好的做到了这一点。
南风
2019/04/22
1.4K0
Hibernate延迟加载
前端延迟加载
由于本人的码云太多太乱了,于是决定一个一个的整合到一个springboot项目里面。
ydymz
2018/11/09
1.1K0
Mybatis使用注解实现一对一复杂关系映射及延迟加载
在加载账户信息时同时加载该账户的用户信息,根据情况可实现延时加载(注解方式实现) 数据库字段如下: user表:
别团等shy哥发育
2023/02/27
3840
Mybatis使用注解实现一对一复杂关系映射及延迟加载
WordPress图片延迟加载(懒加载)
如果不进行设置的话,一个页面会一次性加载所有的资源数据,考虑到不可能所有访客会全部将页面看完,也会导致流量的浪费,加载体验上有待提升。这里就采用延迟加载的方案。
Diuut
2022/11/22
2.5K0
WordPress图片延迟加载(懒加载)
BaseFragment 延迟加载lazyload
注意1:在某些时候setContentView(V)可能会引发null 异常就需要调用setContentView(V,T)
用户4458175
2020/02/12
1.3K0
MyBatis-延迟加载
就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载。
星哥玩云
2022/09/14
1K0
Angular 启用预加载
在使用路由延迟加载中,我们介绍了如何使用模块来拆分应用,在访问到这个模块的时候, Angular 加载这个模块。但这需要一点时间。在用户第一次点击的时候,会有一点延迟。
玖柒的小窝
2021/11/03
1.5K0
Angular 启用预加载
hibernate延迟加载详解
hibernate延迟加载详解 Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能。 下面先来剖析 Hibernate 延迟加载的“秘密”。 集合属性的延迟加载 当 Hibernate 从数据库中初始化某个持久化实体时,该实体的集合属性是否随持久化类一起初始化呢?如果集合属性里包含十万,甚至百万的记录,在初始化持久化实体的同时,完成所有集合属性
Java帮帮
2018/03/19
1.4K0
hibernate延迟加载详解
mybatis的延迟加载
OrderMapper.xml文件的配置: <!-- 2 延迟加载resultMap的配置 --> <resultMap type="com.shi.pojo.Order" id="selectOrderLazyLodingFindUser"> <!-- 对订单信息进行映射配置 --> <id column="id" property="id"/> <result column="user_id" property="user_id"/> <result column="number"
用户5927264
2019/07/31
1.2K0
Mybatis 延迟加载探究
Mybatis 是一个广泛用于 Java 应用程序中的持久层框架,它提供了一种方便的方式来管理数据库操作。在实际应用中,很多情况下我们需要处理大量的数据,而且并不总是需要一次性加载所有相关数据,这时候延迟加载(Lazy Loading)就显得尤为重要。本文将探讨 Mybatis 是否支持延迟加载,以及它的实现原理。
疯狂的KK
2023/09/26
4900
Mybatis 延迟加载探究
Hibernate之延迟加载
文章目录 1. hibernate之延迟加载 1.1. 什么是延迟加载 1.2. 好处 1.3. 如何使用延迟加载 1.4. 使用延迟加载需要注意的问题 hibernate之延迟加载 什么是延迟加载 在使用某些Hibernate方法查询数据的时候,Hibernate返回的只是一个空对象(除了id外属性都为null),并没有真正的查询数据库。而是在使用这个对象的时候才会出发查询数据,并将查询到的数据注入到这个空对象中,这种查询时机推迟到对象访问时的机制称之为延迟加载。 简单的说,使用延迟加载获取的对象,只
爱撒谎的男孩
2019/12/31
9320
MyBatis延迟加载(二)
除了基于代理对象的延迟加载外,MyBatis还提供了基于XML配置的延迟加载方式。在这种方式中,我们需要在MyBatis映射文件中为查询语句配置一个<resultMap>元素,并在该元素中为需要延迟加载的属性添加<association>或<collection>元素。这些元素用于指定需要延迟加载的关联对象属性和延迟加载类型。
堕落飞鸟
2023/05/15
4190
Mybatis的延迟加载
1.什么是延迟加载 在真正需要使用数据时才发起查询,不用的时候不进行查询。按需加载(懒加载) 2. 什么是立即加载 不管用不用,只要一调用方法,马上发起查询。
暴躁的程序猿
2022/03/23
7580
Mybatis的延迟加载
MyBatis延迟加载(一)
MyBatis是一个轻量级的ORM框架,它提供了多种方式来优化SQL查询。其中一种常见的优化技术是延迟加载(lazy loading),它允许在需要时才从数据库中加载相关的数据,从而避免不必要的性能损失和内存消耗。
堕落飞鸟
2023/05/15
5400
CNZZ延迟加载,解决加载缓慢问题
相信绝大部分的站长都是在站点上部署了CNZZ的站点访问统计吧,不过CNZZ的JS在每次加载页面的时候总是要加载那么1~3秒,甚至更长,其原因就是:本来页面都已经加载完成了,又非要多加载那么几秒,这样可能导致用户以为网站打开很慢呢,于是就会出现丢失访客等等一些列啪啦的问题。
墨渊
2018/05/11
3.1K4
jQuery scroll(滚动)延迟加载
延迟加载 $(window).scroll(function(){ var scrollHeight = $(document).height(); //文档高度 var scrollTop = $(this).scrollTop(); //滚动条卷去高度 var windowHeight = $(this).height(); // 窗口高度 // console.log(scrollHeight, scrollTop, windowHeight) if(scrol
deepcc
2018/05/16
9.1K0

相似问题

NHibernate为单个查询启用延迟加载

13

如何在NHibernate中启用插入后关系的延迟加载

11

Nhibernate 3.3延迟加载一对一关联

12

NHibernate -在一对一映射上使用WHERE子句

12

nhibernate延迟加载

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文