首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么不推荐数据库使用外键?

我的经验告诉我,很多数据库(大多数我曾经使用的)不包含外键时并不总是一件坏事。在这篇文章中,我想把重点放在为什么的原因上。 为什么这是一个问题?...2.表格关系不清晰 数据库中缺少外键的另一个不太明显的负面影响是,不了解该模式的人很难找到正确的表并找出表关系。这可能会导致严重的数据库查询和报告问题。 为什么数据库可以没有外键?...这仅仅是我在各种渠道(主要是互联网论坛)都能找到的许多开发人员、架构师为什么不使用它们的理由。 我个人(和许多其他经验丰富的数据库专家)建议在任何可能的地方使用它们(不会导致更多的问题)。...1.性能 在表上拥有活动的外键可以提高数据质量,但会影响插入、更新和删除操作的性能。在这些任务之前,数据库需要检查它是否违反数据完整性。这就是为什么一些架构师和DBA完全放弃外键的原因。...这些框架可以自己创建数据库表,而不总是创建外键。使用这些工具的开发人员很少会干扰自动生成的模式,并且不需要外键。

1.8K20

go modules:使用 mod 管理项目依赖包,通过vendor实现一键分发编译包

依靠go语言最新的mod模块,可以将依赖包的不同版本都缓存至$GOPATH/pkg/mod目录下,各个项目通过go.mod文件各取合适的依赖包版本使用。...如果想实现一键分发编译包,通过go mod vendor指令,将依赖包从$GOPATH/pkg/mod目录拷贝至当前项目目录下的vendor目录中。将目录打包,直接分发即可,当然这限同类平台。...使用go mod edit直接修改 使用 go mod 来进行版本的切换,这样就需要两个步骤了 go mod edit -require="github.com/gin-gonic/gin@v1.1.4...只有当使用go mod vendor指令后,才会将当前所有依赖包拷贝至当前项目目录下。...不要用它代替go mod,管理依赖直接使用go mod指令即可。这个依赖包安装后,在$GOPATH/bin目录下会有一mod二进制文件。执行mod与官方指令go mod并不是一回事。

6.5K21
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    为什么数据库不应该使用外键

    转自:真没什么逻辑 作者:Draveness 为什么这么设计(Why’s THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点...我们在前面的文章中曾经分析过 为什么 MySQL 的自增主键不单调也不连续,这篇文章我们来分析关系型数据库中另一个重要的概念 — 外键(Foreign Key)。...我们可以从可用性、一致性几个方面分析使用外键、模拟外键以及不使用外键的差异: 不使用外键牺牲了数据库中数据的一致性,但是却能够减少数据库的负载; 模拟外键将一部分工作移到了数据库之外,我们可能需要放弃一部分一致性以获得更高的可用性...; 我们在很多时候其实并不能选择是否使用外键,大多数公司的 DBA 都会对数据库系统的使用有比较明确的规定,但是我们要清楚做出使用外键和不使用外键这一抉择的原因。...到最后,我们还是来看一些比较开放的相关问题,有兴趣的读者可以仔细思考一下下面的问题: 数据库中还有哪些特性是我们在生产环境中不会使用的?为什么?

    3.3K10

    12.1 使用键盘鼠标监控钩子

    可以使用组合键,例如Ctrl、Alt、Shift等 vk:热键的虚拟键码,例如VK_F1表示F1键VK_LEFT表示左箭头键等 函数需要传入一个窗口句柄、热键ID、热键组合键等参数来设置热键。...argc, char* argv[]) { // 分别注册三个热键 Ctrl+F1 , Ctrl+F2 , Ctrl+F3 if (0 == RegisterHotKey(NULL, 1, MOD_CONTROL..., VK_F1)) { cout << GetLastError() << endl; } if (0 == RegisterHotKey(NULL, 2, MOD_CONTROL,...VK_F2)) { cout << GetLastError() << endl; } if (0 == RegisterHotKey(NULL, 3, MOD_CONTROL,...如果dwThreadId参数为0,则钩子将应用于所有线程 函数会返回一个类型为HHOOK的句柄,该句柄可以在卸载钩子时使用,读者需要注意由于全局钩子会影响系统性能,因此在使用SetWindowsHookEx

    42920

    一文一点 | 为什么不建议使用数据库外键

    有的SQL规约是这么说的: 【强制】不得使用外键与级联,一切外键概念必须在应用层解决。...用外键不好么,不太好,但也注意,不是不可以,是不建议。 那么这里的不建议,其实也有两说的。 1、如果你为了追求正确性优先于性能的话,可以使用。...那么外键为什么有性能问题呢 1、数据库需要额外的维护外键自身的内部管理; 2、外键相当于把数据的一致性事务的实现,全部交给了数据库服务器来完成; 3、有了外键以后,当做一些涉及到外键字段的增,删,改操作时...,需要触发相关操作去检查,而不得不消耗资源; 4、每次更新数据,都需要额外的检查另外一张表的数据,容易造成死锁; 总结: 1、互联网行业场景中不推荐使用外键,用户量大,并发度高,如果使用外键,数据库服务器很容易产生性能瓶颈...2、传统行业可以使用,强调数据强一致性,而且用户数量有限,可控。 基于此,互联网场景中都是不建议使用外键的,外键与级联更新适用于单机低并发,不适合分布式、高并发集群。

    1.3K20

    记一次调试资源管理器未响应经验

    此时这个窗口将会吃掉所有的除任务栏的输入 这个假设有这样的问题,为什么点击任务栏就能恢复?...如果是全局钩子,那么也点不到任务管理器 所以上面的思路是不对的 实际问题 在任务管理器发现了资源管理器没有响应 也就是实际问题就是资源管理器没有响应,需要了解为什么资源管理器没有响应和可以如何解决 如果这个问题在网上问...他找到的是在这个方法里面调用了 SendMessage 方法卡住,发送的消息是 WM_Notify 消息,那么在进程里面发送消息有什么用。...等等上面是不是乱说,为什么线程的通信会用到消息。假设这个软件都是一个开发,那么线程之间可以访问到内存,此时使用内存通信就可以。...但是资源管理器会使用很多 COM 这部分不是一个开发,通过传内存也不是很好,就通过传 Windows 消息的方式通信 在自定义控件发生了特殊的事件需要通知父窗口时,可以通过发送 WM_Notify 消息

    1.1K20

    VC动态生成菜单菜单响应及加速键的使用

    VC动态生成菜单菜单响应及加速键的使用 一、使用环境     本文讲解的使用环境为MFC 的Visual Studio项目的单文档应用程序类型,字符集使用多字节字符集,对话框和多文档应用程序类型稍有不同这里不再讲解说明...(1)在CMainFrame类的头文件MainFrm.h中添加树形结构菜单存储结构 public: //可点击菜单ID 名称 命令 是否使用加速键 typedef struct _CMDINFO { UINT...nID; //ID CString strName;    //名称 CString strCmd; //命令 bool bAccelkey; //是否使用加速键 _CMDINFO() { nID =...: ON_MESSAGE(WM_HOTKEY, OnHotKey) (3)在CMainFrame类的源文件中添加加速键响应函数定义: LRESULT CMainFrame::OnHotKey(WPARAM...用类向导给CMainFrame类添加WM_DESTORY消息的消息响应函数OnDestroy函数,在函数最后添加取消加速键的注册代码: //取消注册加速键 int count = m_vCmdInfo.size

    32610

    你不知道的 WeakMap

    从而使得键和值的索引在两个数组中相对应。当从该 Map 取值的时候,需要遍历所有的键,然后使用索引从存储值的数组中检索出相应的值。...); // value可以是任意值,包括一个对象或一个函数 wm2.set(o3, undefined); wm2.set(wm1, wm2); // 键和值可以是任意对象,甚至另外一个WeakMap对象...wm1.get(o2); // "azerty" wm2.get(o2); // undefined,wm2中没有o2这个键 wm2.get(o3); // undefined,值就是undefined...那么为什么使用 # 符号,而不是其他符号呢? TC39 委员会解释道,他们也是做了深思熟虑最终选择了 # 符号,而没有使用 private 关键字。...来源于迷渡大大:为什么 JavaScript 的私有属性使用 # 符号 https://zhuanlan.zhihu.com/p/47166400 在 TypeScript 3.8 版本就开始支持ECMAScript

    1.3K33

    【第3版emWin教程】第28章 emWin6.x的C文件格式的汉字生成和实现(Unicode编码)

    mod=viewthread&tid=98429 第28章 emWin6.x的C文件格式的汉字生成和实现(Unicode编码) 本章节主要为大家讲解官方的字体生成软件FontCvt的使用方法...28.1 初学者重要提示 28.2 使用FontCvt生成字库C文件的方法 28.3 C文件格式汉字的使用方法 28..4生成的是Unicode编码字体,而使用时为什么是UTF-8 28.5 MDK4...2、 字体小工具需要使用此贴提供的,其它大部分是Demo版本: http://www.armbbs.cn/forum.php?mod=viewthread&tid=107218 。...修改编码类型也比较容易,使用IAR的话,不要使用记事本来修改了(为什么不可以使用,在28.5小节有讲解),IAR编辑器支持编码类型的修改。...28.5 生成的是Unicode编码字体,而使用时为什么是UTF-8 初学者容易有这样的疑问,FontCvt软件生成的是Unicode编码的汉字,为什么emWin使用的时候不直接使用,还要多一次转换,即我们操作的时候是用的

    1.1K30

    图像处理程序框架—MFC相关知识点

    CDC:Windows使用与设备无关的图形设备环境(DC :Device Context) 进行显示 。 MFC基础类库定义了设备环境对象类----CDC类。...CDC对象使用的属性设备上下文 二者在CDC对象创建时指向相同的设备上下文。...OnDraw()是CVIEW的成员函数,没有响应消息的功能.当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows发送WM_PAINT消息。...而OnPaint()是CWnd的类成员,同时负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,并且没有响应消息的功能。...这就是为什么你用VC成的程序代码时,在视图类只有OnDraw没有OnPaint的原因。而在基于对话框的程序中,只有OnPaint。  其次:我们在第《每天跟我学MFC》3的开始部分已经说到了。

    1.5K20

    WPF 客户端开发需要知道的触摸失效问题

    如果是系统触摸失效了,大概就和没有触摸设备一样,所有的应用和系统都触摸失效 触摸失效的全触摸失效是就像没有触摸设备所有触摸没有响应,但是鼠标可以响应。...而多指触摸失效是触摸不支持多指,但是可以转换为单指触摸或转为鼠标,相当于是鼠标点击 在应用程序里面还有瞬时触摸失效问题,这时的瞬时触摸失效就是某次触摸没有响应,但是此后应用程序能恢复触摸 对于不同的触摸失效问题对应不同的方法...如果在运行过程触摸失效了,也可能和系统相关但是大部分都是应用程序问题 为什么系统没有触摸失效而应用触摸失效了?...for Windows Touch input messages with the RegisterTouchWindow function, notifications for gestures (WM_GESTURE...If an application Window registers to receive touch messages, notifications for Windows Touch input (WM_TOUCH

    2.3K40
    领券