首页 / 知识
关于数据库:在SQL中处理一对一关系的最佳方法是什么?
2023-04-15 00:22:00

What's the best way to handle one-to-one relationships in SQL?假设我有一些Alpha事物可能与Bravo或Charlie事物相关或无关。 这些是一对一的关系:没有Alpha会涉及不止一个Bravo。而且,Bravo不会与一个以上的Alpha相关。 我有一些目标:
我有三个主意
一个包含许多nullalbe字段的表(平面文件)
许多表的零nullalbe字段
两者的最佳(或最差):许多表都有很多nullal外键
如果Alpha必须是Bravo或Charlie,但不能同时是两者,该怎么办? 如果Alphas不仅可以是Bravos和Charlies,还可以是Delta,Echos,Foxtrots或Golfs等中的任何一个? 编辑:这是问题的一部分:哪个是我的导航的最佳数据库架构? 如果您希望每个Alpha仅通过一个Bravo关联,那么我会结合使用FK / PK投票赞成这种可能性:
这样,只有一个Bravo可以引用您的Alpha。 如果Bravos和Charlies必须互斥,则最简单的方法可能是创建一个discriminator字段:
这样,AlphaType字段将强制记录始终完全属于一个子类型。 我假设您将使用SQL Server 2000/2005。我有一个用于我与我之间一对一关系的标准模式,这与您的第二个想法并不太相似,但是这里有区别:
这种方法的主要好处是更改变得更容易:
就个人而言,我在您的第二个模型上取得了很多成功,在单个列上使用了PK / FK。 我从来没有遇到过所有Alpha都必须在Bravo或Charlie表中有记录的情况。我一直处理1 <-> 0..1,从不处理1 <-> 1。 至于最后一个问题,那就是更多的表。 您提出了很多问题,这使得很难选择任何建议的解决方案,而没有对正在尝试解决的确切问题进行更多的澄清。不仅要考虑我的澄清问题,还要考虑评估我的问题所使用的标准,以表明解决问题所需的细节量:
易于学习和维护的"系统"是什么?您的应用程序的源代码还是通过其最终用户界面的应用程序数据?
"在数据库中强制执行"是什么意思?这是否意味着您不能以任何其他方式控制数据完整性,即项目仅需要基于DB的数据完整性规则?
您能为我们提供您所指的现实世界,逻辑组织吗?从您要存储的数据的三个示例中不可能推断出这一点-即假设所有三个结构都是完全错误的。除非我们了解实际规格,否则我们怎么知道?
这个要求听起来像是您的手被迫使用linq to SQL创建它,是这样吗?
什么是"快速"? .03秒? 3秒? 30分钟?尚不清楚,因为您没有指定数据大小和要引用的操作类型。
有效使用空间与空字段的数量无关。如果您指的是规范化的数据库结构,那将再次取决于问题中未提供的真实规范和应用程序的其他设计元素。 到目前为止,我有一个可以很好地适合您的模型的示例: 我有具有Alpha外键alpha_id的Charlie和Bravo表。像您的第一个示例一样,除了alpha不是主键,bravo_id和charlie_id是。 我在需要寻址到这些实体的每个表上使用alpha_id,因此,为了避免可能会导致在研究Bravo和Charlie来查找哪个Alpha时出现延迟的SQL,我创建了一个AlphaType表,并在Alpha表上拥有其ID (alpha_type_id)作为外键。这样,我可以以编程方式知道我要处理的AlphaType,而无需联接可能有成千上万条记录的表。在tSQL中:
您可能有一个连接表,用于指定Alpha和相关ID。然后,您可以添加另一列,以指定它是Bravo,Charlie或其他名称的ID。使列保持在Alpha上,但确实增加了连接查询的复杂性。 另一种方法是使用3个表来存储3个实体,并使用一个单独的表来存储关系。 我将创建一个超类型/子类型关系。
因此,例如,一个具有查理但没有勇气的字母:-
请注意,您不能为alpha创建多个charlie,就像您尝试创建ThingId为1的两个charlies一样,第二个插入将获得唯一的索引/约束冲突。 除非我有重大理由不这样做,否则我会选择选项1。尤其是,它可能不会花费您想象中那么多的空间。如果您在Bravo中使用varchars。不要忘记,拆分将花费您外键,二级身份和所需的索引。 您可能会遇到麻烦的地方是,如果不太可能需要Bravo(<%10),并且需要按其字段之一快速查询,以便对其进行索引。 |
最新内容
相关内容
linux使用命令的方法?
linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,图标,linux的cd命令的使用方法1、cd ~:回到用户家目录。注:这得看你linux命令输入方法?
linux命令输入方法?,系统,电脑,密码,管理,地址,命令,网站,工具,首开,位置,linux终端输入~怎么弄中间在电脑上打开需要的Word文件进入。进入到文linux硬盘关系图命令?
linux硬盘关系图命令?,系统,工具,情况,信息,管理,单位,电脑,设备,数据,命令,linux中查看硬盘分区信息的命令是什么?查看Linux系统分区信息,使用Python中什么是反射?使用方法有哪
Python中什么是反射?使用方法有哪些?,信息,培训,状态,术语,检测,反射,属性,对象,字符串,方法,反射这个术语在很多语言中都存在,并且存在大量的Python类与类之间的关系是什么?
Python类与类之间的关系是什么?,代码,概念,名称,教育,科技,技术,基础,培训,关系,属性,我们都知道Python编程语言是面向对象的,在面向对象中,有类python和人工智能有什么关系
python和人工智能有什么关系,人工智能,数据,培训,工具,技术,时代,项目,基础,科技,浪潮,相信每个人都听过Python的人工智能一词,包括很多PythonSpyder和Python之间是什么关系?
Spyder和Python之间是什么关系?,工作,位置,环境,观察,对比,工具,状态,数据,分析,培训,想必很多人都听说过Spyder,那么你知道它和Python之间有什Python中有哪些方法可以解压文件?
Python中有哪些方法可以解压文件?,工具,系统,工作,培训,文件,文件夹,方法,窗体,不同于,以下内容,在Python学习和日常使用中,很容易造成文件过大Python列表类型list合并有哪些方法
Python列表类型list合并有哪些方法?,培训,方法,列表,可能会,数组,切片,下文,字符串,数据类型,请看,在Python编程语言中,有各种数据类型,比如字符零基础学习Python的四种方法
零基础学习Python的四种方法,基础,代码,基础知识,培训,发展,时间,知识,书籍,初学者,练习,近年来,随着移动互联网的发展,对Python人才的需求越来如何在Python中定义类方法和修改类
如何在Python中定义类方法和修改类属性?,代码,方法,培训,对象,实例,定义,结果,示例,赋值,属性,Python中的类还可定义使用@classmethod修饰的类提高Python 效率的 5 种高级方法
提高Python 效率的 5 种高级方法,代码,数字,函数,有限,设备,项目,工具,培训,列表,内存,任何编程语言的高级特征通常都是通过大量的使用经验才