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

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

来源:www.jdon.com/49188 我的经验告诉我,很多数据库(大多数我曾经使用的)不包含外键时并不总是一件坏事。在这篇文章中,我想把重点放在为什么的原因上。 为什么这是一个问题?...2.表格关系不清晰 数据库中缺少外键的另一个不太明显的负面影响是,不了解该模式的人很难找到正确的表并找出表关系。这可能会导致严重的数据库查询和报告问题。 为什么数据库可以没有外键?...让我们来看看数据库可以没有外键的原因。首先一个简短的免责声明(因为文章引发了一些关于LinkedIn群体的争议): 下面的理由绝不鼓励不要在数据库中使用外键约束。...1.性能 在表上拥有活动的外键可以提高数据质量,但会影响插入、更新和删除操作的性能。在这些任务之前,数据库需要检查它是否违反数据完整性。这就是为什么一些架构师和DBA完全放弃外键的原因。...这些工具负责参照完整性,并与RDBMS一起创建更高级别的数据库引擎。这些框架可以自己创建数据库表,而不总是创建外键。使用这些工具的开发人员很少会干扰自动生成的模式,并且不需要外键。

2.1K10

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

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

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

    asp.net web api 2.2 基础框架(带例子)

    自成树形的model是指自己和自己成主外键关系的Model(表),例如菜单表或者部门表的设计有时候是这样的,下面以部门为例: using System.Collections.Generic; using...其中ParentId,Parent,Children这几个属性是树形关系相关的属性,AncestorIds定义为所有祖先Id层级别连接到一起的一个字符串,需要自己实现。...3.建立Repository 我理解的Repository(百货)里面应该具有各种小粒度的逻辑方法,以便复用,通常Repository里面要包含各种单笔和多笔的CRUD方法。...但是为什么自己建立的Repository不直接继承与EntityBaseRepository,而是中间非得插一层接口呢?...因为我的Repository可能还需要其他的自定义方法,这些自定义方法需要提取到这个接口里面以便使用。

    4.9K90

    Entity Framework 约定

    如果我们定义的模型由继承层次,只需要为基类定义一个DbSet属性即可(如果派生类与基类在同一个程序集,派生类将会被自动包含),代码如下: public class Department { public...DbContext { public EfDbContext() { } public DbSet Departments { get; set; } } 当然,有时候我们不希望模型映射到数据库中...二、关系约定 在数据库中,我们可以通过多张表的关联查询出数据,这多张表之间的关联,就是他们的关系。同样,也可以在模型中定义这样的关系。...EF中定义关系要使用到导航属性,通过导航属性可以定义多个模型之间的关系。大部分情况下我们会将导航属性和外键属性结合在一起使用。...当EF检测出外键属性后,会根据外键属性是否为空来判断关系,如果外键可以为空,那么模型之间的关系将会配置成可选的,Code First 不会再关系上配置级联删除。

    1.3K10

    【实战 Ids4】小技巧篇:自定义登录页操作

    默认为returnUrl ErrorIdParameter = "errorId", //设置传递给错误页面的错误消息ID参数的名称。...数量的限制,有效的保证了浏览器打开多个选项卡,一旦超出了Cookies限制就会清除以前的Cookies值 }; }) 这里的配置是没有走数据库的,只有config.cs里的会配置到数据.../authorize,欣喜雀跃,替换到我的正式项目,不!!...修改Identity应用配置 这个是个小知识点,如果你对Aspnet core的Identity不熟悉的话,可能不会来得及考虑这个问题,因为我的项目是用的Identity来处理应用数据这一块的,如果你公司的项目是自定义的话...,那就不用考虑这个问题了,我也打算在公司尝试使用自定义仓储的模式,替换掉微软官方推荐的Identity类来操作用户应用数据。

    86830

    Entity Framework 关系约束配置

    Entity Framework 关系约束配置  对于实体关系对应的数据表关系,无非“0:1,1:1,1:N,N:N”这几种,可以使用导航属性中的数据类型来表示,0…1端使用单实体类型表示,N端使用ICollection...下面来依依看一下这几种数据表的关系 第一种:0:1。...要配置的实体类型将成为依赖对象,且包含主体的外键。作为关系目标的实体类型将成为关系中的主体。...,并指定了表名、对应的外键;注意如果不使用FluentAPI配置,Product和Order配置了相应的导航属性,EF也会默认生成一张表(表名为“数据类1>+数据类2>”) Map:将关系配置为使用未在对象模型中公开的外键属性...可通过指定配置操作来自定义列和表。如果指定了空的配置操作,则约定将生成列名。如果在对象模型中公开了外键属性,则使用 HasForeignKey 方法。并非所有关系都支持在对象模型中公开外键属性。

    62910

    Entity Framework 多对多映射

    通过上面简单的描述,我们可以分析出学生和课程是多对多的关系。这种关系应设在数据库中就需要第三张表来辅助维持。...Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); //设置要映射的数据...我们为了实现学生和课程多对多的关系,于是定义了关联表,并且设置了这个关联表中两个外键的名称。...注: 在设置多对多关系的时候,如果不定义 MapLeftKey 和 MapRightKey EF将默认使用 实体类型_id 。...在本例中如果不定义这两个键的名称的话,EF默认使用的名称是 Student_Id 和 Courses_Id; MapLeftKey 是关系键 下面我们编写一段代码来测试一下数据库生成的是否是多对多的关系

    1.1K20

    从Membership 到 .NET4.5 之 ASP.NET Identity

    数据表都被你定义好了,但是很抱歉,那都不是我想要的啊!!! 等等。。。   好吧,这些问题确实是导致Membership一直不温不火的原因之一。...而这个类是包含在WebMatrix.WebData.dll中的。...这两个dll主要是给web page用的, 而SimpleMembershipProvider的相关代码就包含在这两个dll当中。 ? ?   ...,同样采用EF Code First来完成数据操作 完全自定义数据结构 单元测试的支持 与Role Provider集成  支持面向Clamis的认证 支持社交账号的登录 OWIN 集成 通过NuGet...Microsoft.AspNet.Identity.EntityFramework   主要包括ASP.NET Identity 的EF 部分的实现,有了EF的帮助我们就可以完全自定义数据结构,当然我们也只需要定义一个实体类就可以了

    1.9K60

    数据结构与算法2016-06-03

    初始部分只处理可以直接解决而不需要再次递归调用的简单输入。递归部分包含对算法的一次或多次递归调用,每一次的调用参数都在某种程度上比原始调用参数更接近初始情况。 2....另外可以在任何时候通过开发附加接口和实现来添加新的功能。 关于接口的很重要的概念是接口只包含成员定义,不包含成员的实现。接口仅仅是一个包含着一组虚方法的抽象类型。...成员的实现需要在继承的类或者结构中实现。接口的成员包括静态方法、索引器、常数、事件以及静态构造器等,不包含任何实例资源或实例构造器,所以,不能实例化一个接口。...枚举数只允许读取集合中的数据,枚举数无法用于修改基础集合。 (4)ICollection接口 ICollection接口定义所有集合的大小、枚举数和同步方法。...ICollection接口是System.Collections命名空间中类的基接口。 (5)IDictionary接口 IDictionary接口是基于ICollection接口的更专用的接口。

    30220

    asp.net web api 异常捕获

    HttpResponseException包含两个重载的构造函数,其中一个是构造函数参数类型为HttpResponseMessage,通过其设置状态码,错误消息短语以及消息体内容来向客户端抛出比较详细的错误信息...2自定义异常过滤器 扩展IExceptionFilter来定义异常过滤器。...异常过滤器不会捕获类型为HttpResponseException的异常,下面的异常也无法被异常过滤器捕获: 1)controller构造器抛出的异常 2)消息处理器抛出的异常 3)路由过程中抛出的异常...示例代码: /// /// 自定义的异常处理程序 /// public class GlobalExceptionHandler : ExceptionHandler...ServiceAssembliesResolver(SysSettings.ServicesLocation));放入try-catch块中,若ServiceAssembliesResolver在实例化的时候不抛出异常

    1.7K120

    Entity Framework DataAnnotations

    public byte[] TimeStamp { get; set; }  System.ComponentModel.DataAnnotations命名空间中只定义了部分实体验证的特性...,在EntityFramework程序集中定义了更多的数据映射特性 7.DatabaseGeneratedAttribute:标记指定实体属性是由数据库生成的,并指定生成策略(None数据库不生成值,Identity...Table("Order",Schema="Order")] public class Order  10.ForeignKeyAttribute:指定导航属性的外键字段 public...[ForeignKey("ID")] public Customer customer { get; set; }  11.NotMappedAttribute:标记指定实体属性在创建数据库中不创建对应字段...,无非“0:1,1:1,0:N,1:N,N:N”这几种,可以使用导航属性中的数据类型来表示,0…1端使用单实体类型表 示,N端使ICollection集合类型表示。

    85230

    命令和查询责任隔离(CQRS)模式

    数据的读和写表示形式之间常常存在不匹配,比如必须正确更新的附加列或属性,尽管它们不是操作的一部分。 当对同一组数据并行执行操作时,可能会发生数据争用。...CQRS的基本思想很简单。但这可能导致更复杂的应用程序设计,特别是如果它们包含事件源模式。 消息传递性。虽然CQRS不需要消息传递,但是通常使用消息传递来处理命令和发布更新事件。...在这种情况下,应用程序必须处理消息失败或重复消息。 最终一致性。如果将读和写数据库分开,则读数据可能会过时。...写模型有一个完整的命令处理堆栈,其中包含业务逻辑、输入验证和业务验证。写模型可以将一组关联对象视为数据更改的单个单元(DDD术语中的聚合),并确保这些对象始终处于一致的状态。...模型接口不指定底层数据存储的任何特性,而且由于这些接口是分离的,它们可以独立地发展和微调。 下面的代码显示了读取的模型定义。

    1K20

    移动开发(五):.NET MAUI中自定义主题设置

    今天给大家分享.NET MAUI应用中如何自定义主题,提升APP本身个性化设置的能力,让你开发的APP更具有吸引力。感兴趣的朋友可以来学习一下!...一、.NET MAUI主题设置原理在 .NET MAUI 中,主题是通过一组预定义的样式和资源来实现的。这些资源定义了界面元素的颜色、字体、大小等样式属性。...方式三、通过代码实现这里打开MainPage.xaml.cs文件,需要先清理之前的资源字典,然后重新添加主题。要不然不生效。...mergedDictionaries.Add(new LightTheme()); } }界面效果如下:然后运行切换效果三、.NET MAUI主题设置技巧资源冲突:如果你在不同的资源字典中定义了相同键的资源...性能考虑:如果用户频繁地在APP运行时更改主题可能会导致性能问题,尤其是在APP主题资源字典很大或者包含大量资源的情况下,可能会引起APP运行的卡顿甚至崩溃的情况。

    33140

    ASP.NET Web API编程——路由

    ,会创建一个路由词典,词典的键是模板中占位符的名称,值是占位符对应的值。...DefaultHttpControllerSelector查找控制器(controller)的算法为: 在路由词典中查找键为“controller”的值,找到键“controller”对应的值后,将字符串...2)如果路由词典中包含关于操作(Action)的键值对,移除链表中名称和值不匹配的操作(Action)。 3)匹配操作(Action)参数与URI。...4)忽略被标记为[NonAction]的方法。 补充说明: 对于步骤3)一个参数可以从URI,请求消息体,或者自定义绑定中获得它的值。...对于来自于URI的参数,要确保URI确实包含对应参数的值,这个值可能在路由词典中或查询字符串中。 对于可选的参数,如果绑定不能从URI中获得参数的值,对于操作(Action)的选择也没有影响。

    1.8K80

    Entity Framework 基础知识走马观花

    例如:NavigationProperty 导航属性,因为T_Person表与T_Class、T_Message表都存在一对一或一对多的关系(即存在外键),因此在EF模型所生成的对象实体中,加入了外键所在实体的导航属性...(2)针对外键的延迟加载   首先,我们有这样两张表,他们是1:N的关系;其中ClassId是T_Person的外键; ?   ...3.3 使用Include提高查询效率   前面我们看到了延迟加载在EF中被广泛应用,但是延迟加载对于外键的加载也存在不足:那就是每次调用外键实体都会去查数据库。   ...(2)通过SQLServer Profiler跟踪,可以发现,每次调用外键实体属性时都会对数据库发出一起查询请求,从下图也可以看出,总共发出了接近10个请求; ?   ...部分数据存入T_Class的T_Person属性中,也就是都存入了内存中,后面再次访问外键实体只需要从内存中读取而不用再发出多个数据库查询请求了。

    1.4K20

    ASP.NET Web API的Controller是如何被创建的?

    Web API调用请求的目标是定义在某个HttpController类型中的某个Action方法,所以消息处理管道最终需要激活目标HttpController对象。...对于Self Host寄宿模式来说,处于消息处理管道末端的HttpRoutingDispatcher会利用ASP.NET Web API的路由系统对当前请求进行路由解析并直接得到封装了路由数据的HttpRouteData...>的字典,它包含了描述所有HttpController的HttpControllerDescriptor对象与对应HttpController名称之间的映射关系。...但是有个问题必须要考虑,由于同名的HttpController类型可能定义在不同的命名空间下,而且这里所指的“HttpController名称”是不区分大小写的,所以一个HttpController名称可能对应着多个...在通过AssembliesResolver提供的程序集中定义了多个同名的HttpController类型,可能是多个HttpController类型在不区分大小写情况下同名,或者是完全同名的多个HttpController

    1.5K60

    最全数据结构详述: List VS IEnumerable VS IQueryable VS ICollection VS IDictionary

    固定大小,数组的大小是初始化时决定无法修改的数值。 2. 强类型,存储数据元素类型必须在初始化时指定,因此在运行时,不需要耗费额外的时间来定义数组类型,能够大大提升运行效率。 3....,使用哈希表查找数据非常方便,哈希表既不是强类型也不固定大小限制。...,栈具有优先级划分的数据结构,栈为每个内容项定义优先级,表示每个Item入栈和出栈的优先顺序。...在内部类中可以定义变量并赋值,接口中不允许此操作。 3. 具体类可包含构造函数,而接口中不能定义构造函数 4. 抽象类中可包含访问修饰符如public,private等,接口中不能包含。 ?...ICollection 继承了IEnumberable,但是IEnumberable是基于索引的,ICollection不基于索引。 ?

    2K80

    如何处理EF Core的多对多关系?

    【无法确定类型为“ICollection”的导航属性“Cart.Items”表示的关系。...【实体类型“CartItem”需要定义一个主键。】 对,CartItem没有主键, 由于它是多对多关系,因此它应该具有复合主键。复合主键类似于常规主键,但它由两个属性(列)而不是一个属性组成。...目前,创建复合键的唯一方法是在OnModelCreating. protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating...插入多对多 假设我们已经有Cart和Item在我们的数据库中,现在我们想将特定商品(Item)添加到特定购物车(Cart),为了做到这一点,我们需要创建新的CartItem并保存它。...从数据库中获取数据相当简单,注意使用Include关联检索相关数据。

    3K20
    领券