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

为什么不使用模型关联创建外键

在数据库设计中,外键是用来建立表与表之间关联关系的一种机制。在传统的数据库设计中,我们可以使用模型关联来创建外键,即通过在一个模型中引用另一个模型的主键来建立关联关系。然而,有时候我们可能会选择不使用模型关联来创建外键,以下是一些可能的原因:

  1. 灵活性:使用模型关联创建外键会将关联关系硬编码到模型中,这意味着如果我们需要更改关联关系,就需要修改模型的定义。而不使用模型关联创建外键可以提供更大的灵活性,我们可以在数据库层面进行关联关系的调整,而无需修改模型。
  2. 性能:在某些情况下,使用模型关联创建外键可能会对性能产生一定的影响。例如,在大规模的数据库中,模型关联可能会导致复杂的查询和连接操作,从而降低查询性能。而不使用模型关联创建外键可以通过手动编写查询语句来优化性能。
  3. 数据库迁移:使用模型关联创建外键可能会导致数据库迁移的复杂性增加。当我们需要迁移数据库时,可能需要同时修改模型和数据库结构,这增加了迁移的复杂性和风险。而不使用模型关联创建外键可以简化数据库迁移的过程,只需关注数据库结构的变化即可。
  4. 跨数据库支持:不同的数据库系统对于模型关联的支持程度可能有所不同。使用模型关联创建外键可能会限制我们在不同数据库系统之间的迁移和兼容性。而不使用模型关联创建外键可以提高跨数据库的支持性。

总结起来,不使用模型关联创建外键可以提供更大的灵活性、更好的性能、简化数据库迁移过程以及增强跨数据库的支持性。然而,这也意味着我们需要在应用程序中手动处理关联关系,编写更多的查询语句和逻辑代码。在具体的应用场景中,我们需要根据实际需求和数据库设计原则来决定是否使用模型关联创建外键。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么推荐数据库使用

我的经验告诉我,很多数据库(大多数我曾经使用的)包含时并不总是一件坏事。在这篇文章中,我想把重点放在为什么的原因上。 为什么这是一个问题?...2.表格关系不清晰 数据库中缺少的另一个不太明显的负面影响是,不了解该模式的人很难找到正确的表并找出表关系。这可能会导致严重的数据库查询和报告问题。 为什么数据库可以没有?...1.性能 在表上拥有活动的可以提高数据质量,但会影响插入、更新和删除操作的性能。在这些任务之前,数据库需要检查它是否违反数据完整性。这就是为什么一些架构师和DBA完全放弃的原因。...这些工具负责参照完整性,并与RDBMS一起创建更高级别的数据库引擎。这些框架可以自己创建数据库表,而总是创建使用这些工具的开发人员很少会干扰自动生成的模式,并且不需要。...9.保持模型的秘密 也许这是一个很遥远的问题,但也许有时候是因为人们希望别人知道太多太容易。一般来说,人们希望被需要和不可替代。一个完美的自我解释的设计可能会使他们过时。但这只是我的理论。

1.8K20

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

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

1.2K20
  • 数据库推荐使用的 9 个理由

    2.表格关系不清晰 数据库中缺少的另一个不太明显的负面影响是,不了解该模式的人很难找到正确的表并找出表关系。这可能会导致严重的数据库查询和报告问题。 为什么数据库可以没有?...让我们来看看数据库可以没有的原因。首先一个简短的免责声明(因为文章引发了一些关于LinkedIn群体的争议): 下面的理由绝不鼓励不要在数据库中使用约束。...1.性能 在表上拥有活动的可以提高数据质量,但会影响插入、更新和删除操作的性能。在这些任务之前,数据库需要检查它是否违反数据完整性。这就是为什么一些架构师和DBA完全放弃的原因。...这些工具负责参照完整性,并与RDBMS一起创建更高级别的数据库引擎。这些框架可以自己创建数据库表,而总是创建使用这些工具的开发人员很少会干扰自动生成的模式,并且不需要。...9.保持模型的秘密 也许这是一个很遥远的问题,但也许有时候是因为人们希望别人知道太多太容易。一般来说,人们希望被需要和不可替代。一个完美的自我解释的设计可能会使他们过时。但这只是我的理论。

    1.7K30

    数据库推荐使用的9个理由

    来源:www.jdon.com/49188 我的经验告诉我,很多数据库(大多数我曾经使用的)包含时并不总是一件坏事。在这篇文章中,我想把重点放在为什么的原因上。 为什么这是一个问题?...2.表格关系不清晰 数据库中缺少的另一个不太明显的负面影响是,不了解该模式的人很难找到正确的表并找出表关系。这可能会导致严重的数据库查询和报告问题。 为什么数据库可以没有?...1.性能 在表上拥有活动的可以提高数据质量,但会影响插入、更新和删除操作的性能。在这些任务之前,数据库需要检查它是否违反数据完整性。这就是为什么一些架构师和DBA完全放弃的原因。...这些工具负责参照完整性,并与RDBMS一起创建更高级别的数据库引擎。这些框架可以自己创建数据库表,而总是创建使用这些工具的开发人员很少会干扰自动生成的模式,并且不需要。...9.保持模型的秘密 也许这是一个很遥远的问题,但也许有时候是因为人们希望别人知道太多太容易。一般来说,人们希望被需要和不可替代。一个完美的自我解释的设计可能会使他们过时。但这只是我的理论。

    2.1K10

    抖音提前批二面:为啥推荐使用

    大家在学习数据库的过程中一定都接触过这个概念,并且在各种课后习题中外还是一个非常重要的考察内容,但是在实际的企业开发过程中,你会发现是被严格禁止使用的,当需要多个表之间进行关联时,做法是冗余相关字段...为什么? 什么是? 两张表有关联关系,才会涉及的概念。...来定义,将当前表的字段关联到另一张表的某个字段。...通俗来说: 成绩表插入数据时,student_id 必须是学生表已存在的 id 学生表删除/更新数据时,会自动删除/更新成绩表中引用 student.id 的数据(级联) 为什么推荐使用?...阿里的开发手册中提到: 【强制】不得使用与级联,一切概念必须在应用层解决。 定义之后,数据库的每次操作都需要去检查约束。

    24310

    为什么数据库不应该使用

    我们在前面的文章中曾经分析过 为什么 MySQL 的自增主键不单调也连续,这篇文章我们来分析关系型数据库中另一个重要的概念 — (Foreign Key)。...一致性检查 当我们使用默认的类型 RESTRICT 时,在创建、修改或者删除记录时都会检查引用的合法性。...,这个过程相对比较麻烦,不过也是为了实现完整性的必要代价,不过这种模拟方法其实远比使用更消耗资源,它不仅需要查询关联数据,还要通过网络发送更多的数据包。...级联操作 当我们在关系型数据库中创建约束时,如果使用如下所示的 SQL 语句指定更新或者删除记录时使用 CASCADE 行为,那么在客户端更新或者删除数据时就会触发级联操作: ALTER TABLE...到最后,我们还是来看一些比较开放的相关问题,有兴趣的读者可以仔细思考一下下面的问题: 数据库中还有哪些特性是我们在生产环境中不会使用的?为什么

    3.2K10

    如何使用 Django 更新模型字段(包括字段)

    每个成绩记录都关联到一个学生,通过 student 字段与学生表建立联系。3. 更新方法探讨在 Django 中,更新模型字段的方法有几种。...常见的方式是使用模型实例的 save() 方法来保存修改。对于字段的更新,我们可以使用直接设置字段的方式,而不需要每次都查询表中的对象。...下面我们详细探讨这种更新方式:使用 attrs 方式更新字段在 Django 中,可以直接通过设置字段的方式来更新模型中的关联。...总结与实践建议在本教程中,我们深入探讨了如何使用 Django 更新模型字段,特别是处理字段更新的方法。...通过使用 attrs 方式,我们能够高效地更新模型中的关联,同时保持数据的一致性和性能的优化。这种方法对于开发复杂应用程序和处理大量数据操作时特别有用。

    21810

    Java为什么建议使用Executors来创建线程池呢?

    Java创建线程池方式 在Java中,创建线程池主要使用java.util.concurrent包下的Executors类。这个类提供了几种静态工厂方法,用于创建和管理不同类型的线程池。...创建方法:Executors.newScheduledThreadPool(int corePoolSize) 5.自定义线程池 除了使用Executors类提供的静态工厂方法创建线程池,还可以通过实例化...因为它是阻塞队列,所以它可以用于生产者和消费者模型,在生产者线程和消费者线程之间传递数据。...LinkedBlockingQueue 的主要特点就几个 容量可选 阻塞操作 非阻塞操作 线程安全 高效的并发性能 为什么说容量可选呢?...所以我们推荐直接使用 Executors 来创建线程池,但是我们更推荐使用 ThreadpoolExecutor创建线程池。

    24510

    如何创建一个线程池,为什么推荐使用Executors去创建呢?

    我们在学线程的时候了解了几种创建线程的方式,比如继承Thread类,实现Runnable接口、Callable接口等,那对于线程池的使用,也需要去创建它,在这里我们提供2种构造线程池的方法: 方法一:...在这里插入图片描述 方法二: 通过 Executor 框架的工具类 Executors 来创建推荐)   Executors 是java并发工具包中的一个静态工厂类,在JDK1.5时被创造出来,提供了丰富的创造线程池的方法...为何很多大厂都禁止使用Executors 创建线程池呢?    ...而CachedThreadPool使用的是同步队列 SynchronousQueue, 允许创建的线程数量也为 Integer.MAX_VALUE ,如果任务数量过多且执行速度较慢,可能会创建大量的线程...,从而导致 OOM,其他的方法所提供的均是这种无界任务队列,在高并发场景下导致OOM的风险很大,故大部分的公司已经建议采用Executors提供的方法创建线程池了。

    10210

    为什么推荐你使用vue-cli创建脚手架?

    最近在知乎看到一个问题,原问题如下: “ 很奇怪,为什么现在能找到自己手动创建vue脚手架的文章非常少,而且大家似乎对webpack4的热情并不高,对于想基于vue2.0+webpack4搭建一个脚手架的我来说资料真是少得可怜...中级前端或者更进阶者就有统筹全局的能力,类似于文章开头说的,能手动创建一个和公司项目需求深度定制的vue脚手架,而不再依赖于官方提供的vue-cli,一方面自己定制的脚手架哪出了问题自己心里清楚,从而也能培养自己前端架构的能力...当然,如果你直接使用了vue-cli,你的领导要求你将webpack的版本从3升级到最新的大版本4,你会不会一脸懵逼呢?...可以使用该方式npm install extract-text-webpack-plugin@next解决。...这就是我为什么推荐你使用vue-cli创建脚手架的原因(此文的受众是想要进阶中级的初级前端人员)。

    2.4K140

    特别篇之 为什么建议你直接使用UIImage传值?--从一个诡异的相册九图连读崩溃bug谈起

    关于"番特别篇" 所谓"番特别篇",就是系列文章更新期间内,随机插入的一篇文章.目前我正在更新的系列文章是 实现iOS图片等资源文件的热更新化.但是,这两天,被一个自己App中诡异的相册读取的Bug...resultHandler: 替换 requestImageForAsset:targetSize:contentMode:options:resultHandler: 就可以了,前者是直接返回二进制数据,渲染...以后再用到,肯定还会有相同问题,还不如直接把原来的实现直接替换掉.当然,这也是成本最小的方法.这个库,本身,已经在App内,深度定制和重写了,如果一些成熟的第三方库,这么做,最好先备份或备注下. 5.使用...回到问题本身,用一句概括就是:永远不要直接传递UIImage对象.在需要传递UIImage的场景中,请使用图片名或者NSData二进制对代替....我真没想到,一个UIImage对象,竟然会二次引起高内存占用.最终的解决方法,就是在前一个页面传递 NSData数组,在赋值处,再使用imageWithData:转换为 UIImage.这样,内存使用基本没什么起伏

    1.7K70

    django 引用自身和on_delete参数

    模型使用引用自己本身。...如果对应的那条数据被删除了,那么这条数据也会被删除。 PROTECT:受保护。即只要这条数据引用了的那条数据,那么就不能删除外的那条数据。如果我们强行删除,Django就会报错。...== 可以不用指定默认值 == DO_NOTHING:采取任何行为。一切全看数据库级别的约束。...; NOACTION:同 RESTRICT效果一样,也是首先先检查; CASCADE:父表delete、update的时候,子表会delete、update掉关联记录; SET NULL:父表delete...、update的时候,子表会将关联记录的字段所在列设为null,所以注意在设计子表时不能设为not null; 为什么在django中可以是用不同的约束去操作数据库呢。

    1.3K20

    Gorm 关联关系介绍与基本使用

    4.7 自3定义连接表 4.8 约束 4.9 复合 五、实体关联 5.1 自动创建、更新 5.2 跳过自动创建、更新 5.3 Select/Omit 关联字段 5.4 关联模式 5.4.1 查找关联...默认情况下,的名字,使用拥有者的类型名称加上表的主键的字段名字 例如,定义一个User实体属于Company实体,那么的名字一般使用CompanyID。...string UserName string // 使用 UserName 作为 } 2.3 重写引用 默认情况下,拥有者实体会将 has one 对应模型的主键保存为,您也可以修改它,用另一个字段来保存...当然,您不需要使用全部的标签,你可以仅使用其中的一个重写部分的、引用。...如果您的模型使用了 复合主键,GORM 会默认启用复合

    47910

    Django模型

    django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。... 这个东西,通常都是在业务逻辑层面来实现的,而不是在数据库中实现。但是通常大家学习的数据库课程中,都会有数据库设计范式,其中有个第三范式就是专指的约束。在这里只是简单的介绍一下。...下面是另外一个模型,和前面的BookInfo模型通过关联起来。...:通过使用models.ForeignKey来设置,ForeignKey的第一个参数是要关联模型类名,第二个参数是on_delete。...仅在该字段设置了默认值时可用 SET()设置为特定值或者调用特定方法 DO_NOTHING不做任何操作,如果数据库前置指明级联性,此选项会抛出IntegrityError异常 注意:我们在数据库中,设置的时候需要制定另一张表中关联的字段

    1.9K20

    BIEE_biee报表日志

    目录 创建资料库 创建物理模型 创建逻辑模型 创建展现模型 保存资料库 配置 Oracle BI Server 使用新资料库 在Oracle Answer中定义查询 参考 创建资料库 BIEE的资料库...使用同样的方法将V_FINANCE_EXPENSE表的CONSUME_ID字段定义为主键。 最后定义物理表之间的。...Physical Table”窗口的“Foreign Keys”页上点“New”按钮,设定V_COMMON_MEMBER表的MEMBER_ID字段为V_FINANCE_EXPENSE表MEMBER_ID字段的...Server Administration Guide 文档建议在逻辑模型中不要建立逻辑(Logical Foreign Key),而应使用逻辑连接[5]。...首先设定Member Dim内逻辑字段所需的物理表,以及表间的关联关系。(我不确定是否一定要这样做,物理表间的关联在物理模型中已经设置了,为什么这里还要做一遍?)

    49230

    MySQL周内训参照1、ER实体关系图与数据库模型图绘制

    2 产品经理 数据库模型图 10 使用工具统一版本viso2013 需要根据绘制的ER图来完成数据库模型图,要求有: 1、表的属性与ER图表中显示属性要求一致。 2、表之间连线主外关系明确。...Crow's Foot数据库表示法——数据库模型使用形状 这里需要注意外需要自己添加一下,连线的时候注意美观。...属性设计: wallet_id: 钱包ID(主键,自增) user_id: 所属用户ID(关联user表的user_id) balance: 钱包余额 created_at: 创建时间...,关联订单表)、商品ID(关联商品表)、购买数量、单价等。...购买数量 unit_price: 单价 ER图与数据库模型图绘制——快PM11点了,我就描述一下画了。

    19810

    Sequelize笔记

    定义 注意:使用sequelize创建表,创建出来的表名一定是小写的!但是表字段可以是大小写混合。...这也适用于关联生成的. // 将自动设置所有属性的字段参数为下划线命名方式. // 不会覆盖已经定义的字段选项 // 这样 updatedAt 的字段名会是 updated_at underscored...一对一:belongsTo,hasOne 一对一关联是由一个单一的,实现两个模型之间的精确关联. // Comment属于User,即User是主表,Comment是副表 // 给Comment起别名...Article_tag,即article_id是,指定Article_tag主键,默认为tagId // Article.belongsToMany(Tag, { through: Article_tag..., foreignKey: 'article_id' }) // 将tag_id添加到Article_tag,即tag_id是,指定Article_tag主键,默认为ArticleId // Tag.belongsToMany

    3.8K10
    领券