Questions tagged «relational-database»

关系数据库是基于数据关系模型的数字数据库。此模型将数据组织到一个或多个列和行的表(或“关系”)中

9
在关系数据库中使用列表可以吗?
我一直在尝试设计一个与项目概念相适应的数据库,并遇到了一个似乎引起激烈争论的问题。我已经阅读了几篇文章和一些Stack Overflow的答案,指出永远(或几乎永远)无法在字段中存储ID或类似内容的列表-所有数据都应该是相关的,等等。 不过,我遇到的问题是我正在尝试创建任务分配器。人们将创建任务,将其分配给多个人,并将其保存到数据库中。 当然,如果我将这些任务分别保存在“人员”中,则必须有几十个虚拟的“任务ID”列并对其进行微管理,因为可以将0到100个任务分配给一个人。 再一次,如果我将任务保存在“任务”表中,则必须有几十个虚拟的“ PersonID”列并对其进行微管理-与以前一样的问题。 对于这样的问题,是否可以保存采用一种形式或另一种形式的ID列表,或者我只是不考虑另一种可以在不违反原则的情况下实现的方式?

7
为什么数据库的关系模型很重要?
我正在处理一个项目,在那里我将不得不与老板一起实现数据库。我们是一家很小的初创公司,因此工作环境非常个人化。 他以前曾给我提供过公司数据库之一,它完全违背了我在学校为RDBMS所教(和读到的)的知识。例如,这里有整个数据库由一个表组成(每个独立数据库)。这些表之一是20+列长,对于上下文,这是一个表中的一些列名: lngStoreID | vrStoreName | lngCompanyID | vrCompanyName | lngProductID | vrProductName 关键是,在他应该拥有保存实体数据(名称,大小,购买日期等)的单个表的情况下,他将所有数据都推入了每个数据库的一个大表中。 我想改进此设计,但是我不确定为什么正确归一化和分段的数据模型实际上可以改进此产品。虽然我熟悉大学的数据库设计并且知道如何进行设计,但是我不确定为什么它实际上可以改善数据库。 为什么好的关系模式可以改善数据库?

11
我应该在数据库中还是仅在代码中定义表之间的关系?
根据我的经验,我过去阅读的许多项目在数据库中都没有关系定义,而是仅在源代码中定义了它们。因此,我想知道在数据库和源代码中定义表之间的关系的优缺点是什么?而更广泛的问题是关于现代数据库中的其他高级功能,例如级联,触发器,过程...我的想法有几点: 在数据库中: 从设计中纠正数据。防止可能导致无效数据的应用程序错误。 在插入/更新数据时减少网络与应用程序的往返路程,因为应用程序必须进行更多查询以检查数据完整性。 在源代码中: 更灵活。 在扩展到多个数据库时更好,因为有时该关系可以是跨数据库的。 更好地控制数据完整性。数据库不必每次应用程序修改数据时都要检查一次(复杂度可以是O(n)或O(n log n)(?))。而是将其委托给应用程序。而且我认为,与使用数据库相比,在应用程序中处理数据完整性将导致更多详细的错误消息。例如:创建API服务器时,如果您在数据库中定义了关系,并且出了一些问题(例如所引用的实体不存在),则会收到一条带有消息的SQL异常。简单的方法是将500返还给客户端一个“内部服务器错误”,并且客户端不知道出了什么问题。或者服务器可以解析消息以找出问题所在,我认为这是一种难看且容易出错的方式。如果您让应用程序处理此问题, 还有别的事吗? 编辑:正如Kilian指出的那样,关于性能和数据完整性的观点非常误导。所以我编辑来纠正我的观点。我完全理解让数据库处理将是一种更有效,更可靠的方法。请检查更新的问题,并对此进行一些思考。 编辑:谢谢大家。我收到的所有答案都指出,约束/关系应在数据库中定义。:)。我还有一个问题,因为它超出了此问题的范围,我将其发布为一个单独的问题:处理API服务器的数据库错误。请留下一些见解。

4
为什么将MySQL用于字典网站是个坏主意?
我打算设计和建立一个数据库,以存储词典条目(通常是单个单词)及其在另一种语言中的含义。因此,例如,表Glossary必须具有条目和定义,并且每个表记录都具有对存储在其中的记录的ID的引用Tag(每个条目必须具有标签或类别)。 由于我的数据具有结构,因此我认为使用SQL数据库(如MySQL)并不是一个坏主意;但是人们说MongoDB的性能要好得多。 在客户端,应用程序必须能够提供一个具有自动完成功能的搜索框,该框使用后端提供的REST API。在这种情况下使用MySQL是否安全?还是应该为此使用MongoDB或任何其他解决方案的ElasticSearch?应该以这种方式存储和访问数十万条记录。

8
对于需要按内容搜索的大型数据集,使用NoSQL数据库是否不切实际?
我已经学习NoSQL数据库已有一个星期了。 我真的了解NoSQL数据库的优势以及它们非常适合的许多用例。 但是人们通常会在撰写文章时就好像NoSQL可以代替关系数据库一样。还有一点我无法理解: NoSQL数据库是(通常)键值存储。 当然,可以将所有内容存储到键值存储中(通过将数据编码为JSON,XML等),但是我看到的问题是,在许多情况下,您需要获取一些与特定条件匹配的数据用例。在NoSQL数据库中,只有一个可以有效搜索的条件-密钥。关系数据库经过优化,可以有效地搜索数据行中的任何值。 因此,NoSQL数据库并不是持久存储需要按其内容搜索的数据的真正选择。还是我误会了什么? 一个例子: 您需要存储网上商店的用户数据。 在关系数据库中,您将每个用户存储为users表中的一行,并带有ID,名称,他的国家等。 在NoSQL数据库中,您将以ID为密钥存储每个用户,并将其所有数据(以JSON等编码)存储为值。 因此,如果您需要从某个特定国家/地区获取所有用户(出于某种原因,营销人员需要了解他们的某些信息),那么在Relational Database中这样做很容易,但是在NoSQL Database中却不是很有效,因为您必须获取每个用户,解析所有数据并进行过滤。 我并不是说这是不可能的,但是它变得更加棘手,如果您要搜索NoSQL条目的数据,我想那不是那么有效。 您可以为每个国家/地区创建一个密钥,以存储该国家/地区中每个用户的密钥,并通过获取存放在该国家/地区的密钥中的所有密钥来获取特定国家/地区的用户。但是我认为这种技术使复杂的数据集变得更加复杂-难以实现且不如查询SQL数据库有效。因此,我认为这不是您在生产中使用的方式。还是? 我不确定我是否会误解或忽略了一些概念或最佳实践来处理此类用例。也许您可以纠正我的陈述并回答我的问题。

7
数据库约束发生了什么?
当我查看RDBMS的数据库模型时,通常会惊讶地发现几乎没有约束(除了PK / FK)。例如,百分比通常存储在类型的列中int(虽然tinyint会更合适),并且没有CHECK约束将值限制为0..100范围。同样在SE.SE上,建议检查约束的答案通常会收到注释,表明数据库是约束的错误位置。 当我询问不实施约束的决定时,团队成员会回答: 他们甚至都不知道自己喜欢的数据库中是否存在这样的功能。对于仅使用ORM的程序员而言,这是可以理解的,但是对于声称拥有给定RDBMS 5年以上经验的DBA而言,这是可以理解的。 或者它们在应用程序级别强制执行此类约束,并且在数据库中复制这些规则不是一个好主意,这违反了SSOT。 最近,我看到越来越多的项目甚至不使用外键。同样,我在SE.SE上看到了一些评论,这些评论表明用户不太在意引用完整性,让应用程序来处理它。 当询问团队有关不使用FK的选择时,他们说: 例如,当必须删除其他表中引用的元素时,它就是PITA。 NoSQL坚如磐石,那里没有外键。因此,我们在RDBMS中不需要它们。 就性能而言,这并不是什么大问题(上下文通常是在小型数据集上运行的小型Intranet Web应用程序,因此,实际上,即使索引也没有太大关系;没有人会介意给定查询的性能是否超过1.5 s到20毫秒)。 当我查看应用程序本身时,我系统地注意到了两种模式: 该应用程序会正确清理数据并在将其发送到数据库之前对其进行检查。例如,无法102通过应用程序将值存储为百分比。 该应用程序假定来自数据库的所有数据都是完全有效的。就是说,如果102以百分比来表示,某处某处将崩溃,或者仅将其按原样显示给用户,从而导致奇怪的情况。 尽管超过99%的查询是由单个应用程序完成的,但随着时间的流逝,脚本开始出现-要么在需要时手动运行脚本,要么执行cron作业。还可以手动对数据库本身执行某些数据操作。脚本和手动SQL查询都具有引入无效值的高风险。 这是我的问题: 没有关系约束而最终甚至没有外键的关系数据库建模的原因是什么? 就其价值而言,这个问题和我收到的答案(尤其是与Thomas Kilian进行的有趣的讨论)使我写了一篇有关数据库约束的结论文章。

9
通过为每列设置预定义的数据类型,关系数据库能获得什么?
我现在正在使用SQL数据库,这一直使我感到好奇,但是Google搜索的机会并不多:为什么使用严格的数据类型? 我了解为什么会有几种不同的数据类型,例如区分二进制数据和纯文本数据很重要。现在,我知道将二进制数据存储为自己的格式比将二进制数据的1和0格式存储为纯文本要好得多。 但是我不明白的是拥有这么多种不同的数据类型的好处是什么: 为什么mediumtext,longtext和text? 为什么decimal,float和int? 等等 告诉数据库“此列的条目中只有256个字节的纯文本数据”有什么好处。或“此列最多可以包含16,777,215字节的文本条目”? 这是性能优势吗?如果是这样,为什么在事前知道条目的大小对性能有何帮助?或更确切地说是其他东西吗?

1
什么时候应该使用文档数据库,关系数据库和图形数据库?[关闭]
为了讨论的目的,让我们考虑一个FourSquare方案。 情境 实体: 用户数 地方 关系: 签到:用户<->地点,很多对很多 朋友:用户<->用户,多对多 数据库设计 这些很可能有错误,请指出。 关系数据库管理系统 表格: 用户数 地方 签到(交界处) 朋友(交界处) 优点: CAP:一致性,可用性 缺点: CAP:分区容限,也称为分片 方案=不灵活的结构 复制不良? 图形 对象: 用户数 地方 边缘: 朋友:用户<->用户 签到:用户->地点 包含时间戳 优点: CAP:一致性,可用性? 无模式,易变的对象和边缘 图形遍历查询,例如: 聚类 寻找一群朋友 寻找类似人喜欢的餐厅 还有其他常见/有用的查询吗? 缺点: CAP:分区容忍度? 文件/物件 3个独立的数据库? 用户数 朋友清单 签到 时间戳记 用户 地点 地方 优点: …

4
为什么许多设计会忽略RDBMS中的规范化?
想要改善这篇文章吗?提供此问题的详细答案,包括引文和答案正确的解释。答案不够详细的答案可能会被编辑或删除。 我看到很多设计都认为标准化不是决策阶段的首要考虑。 在许多情况下,这些设计包括超过30列,主要方法是“将所有内容放置在同一位置” 根据我记得,归一化是最重要的第一件事,那么为什么有时它这么容易掉下来? 编辑: 好的建筑师和专家选择非规范化的设计,而没有经验的开发人员选择相反的设计,这是真的吗?反对着手规范化设计的观点是什么?

3
如何在关系数据库中存储订购的信息
我正在尝试了解如何在关系数据库中正确存储有序信息。 一个例子: 假设我有一个由歌曲组成的播放列表。在我的关系数据库中,我有一个的表Playlists,其中包含一些元数据(名称,创建者等)。我还有一个名为的表Songs,其中包含playlist_id和特定于歌曲的信息(名称,艺术家,时长等)。 默认情况下,将新歌曲添加到播放列表时,它将添加到末尾。按Song-ID(升序)订购时,该顺序将为添加顺序。但是,如果用户应该能够对播放列表中的歌曲重新排序,该怎么办? 我提出了一些想法,每个想法都有其优点和缺点: 称为的列order,它是整数。移动歌曲时,所有歌曲在其旧位置和新位置之间的顺序都会更改,以反映更改。这样做的缺点是,每次移动歌曲时都需要进行很多查询,并且移动算法不像其他选项那样琐碎。 称为的列order,它是一个十进制(NUMERIC)。移动歌曲时,会为其分配两个相邻数字之间的浮点值。缺点:十进制字段会占用更多空间,并且可能会精度不够,除非在每次更改后都注意重新分配范围。 另一种方法是使用previous和next字段引用其他歌曲。(或者,如果现在是播放列表中的第一首和最后一首歌曲,则为NULL;基本上,您将创建一个链表)。缺点:诸如“在列表中找到第X首歌曲”之类的查询不再是固定时间,而是线性时间。 在实践中最常使用以下哪个程序?在大中型数据库上,以下哪个过程最快?还有其他方法可以存档吗? 编辑:为简单起见,在此示例中,一首歌曲仅属于一个播放列表(多对一关系)。当然,也可以使用Junction Table,因此song⟷playlist是一个多对多关系(并在该表上应用上述策略之一)。

3
关系数据库和迭代开发
在许多软件开发方法中,例如敏捷方法论,领域驱动设计和面向对象的分析与设计,都鼓励我们采用一种迭代方法进行开发。 因此,我们不应该在第一次开始从事该项目时就正确完成我们的领域模型。相反,随着时间的流逝,我们重构模型,因为随着时间的流逝,我们对问题领域有了更深入的了解。 除此之外,即使我们已经尝试过建立一个完美的模型(我已经确信这很困难),需求也可能会发生变化。软件打完已经被部署到生产,最终用户可能会注意到,有一定要求的不完全了解,或者更糟的是,一些要求失踪了。 这里的要点是,在软件部署之后,我们可能最终需要更改模型。如果发生这种情况,我们就会遇到问题:生产数据库中的用户数据很重要,并且已经以旧模型的格式进行了拟合。 如果代码设计不当且系统很大,则更新代码可能是一项艰巨的任务。但这可以随着时间的推移而完成,我们拥有类似Git的工具,可以帮助我们做到这一点,而不会损坏可投入生产的版本。 另一方面,如果模型改变,类的属性消失或其他原因,则数据库也应改变。但是我们有一个问题:已经有不能丢失的数据,已经为旧模型格式化了。 关系数据库似乎是阻碍我们进行迭代开发甚至在最终用户需要时更新软件的障碍。 我已经使用的一种方法是编写一个特殊的类,该类将旧的数据库表映射到新的数据库表。因此,这些类选择旧格式的数据,将其转换为新模型使用的格式,然后保存到新表中。 这种方法似乎不是最好的方法。我在这里的问题是:是否存在任何众所周知的和推荐的方法来协调迭代开发与关系数据库?

5
为什么选择RIGHT JOIN而不是LEFT JOIN
如果我理解正确,每个RIGHT JOIN: SELECT Persons.*, Orders.* FROM Orders RIGHT JOIN Persons ON Orders.PersonID = Persons.ID 可以表示为LEFT JOIN: SELECT Persons.*, Orders.* FROM Persons LEFT JOIN Orders ON Persons.ID = Orders.PersonID 我个人认为该声明的意图是: 首先得到 Persons 然后Persons根据需要展开/重复,以匹配Orders 最好用的顺序来表示,而Persons LEFT JOIN Orders不是用相反的顺序来表示Orders RIGHT JOIN Persons(因此我从不使用RIGHT JOIN)。 有什么情况下RIGHT JOIN首选a?或者,是否有任何用例RIGHT JOIN可以做一些不能做的事情LEFT JOIN?

3
文档数据库与关系数据库:如何选择?
我是一个SQL专家,但我知道不仅有SQL数据库-大多数是文档数据库。与大多数技术一样,每种技术也各有利弊。 我读过一些文章,但是它们太理论化了。我想要的是两个真实的案例: 从关系数据库到文档数据库的转换带来了改善 从文档数据库到关系数据库的转换带来了改善 改进是指可以制定更好程序的任何事物-更少的开发时间,可扩展性,性能,以及与编程相关的任何事物。需要注意的是2 .:诸如“因为每个人都知道SQL而回退到关系数据库”之类的故事不好

4
我怎么知道我的数据本质上是关系型或面向对象的?
只需阅读这些行- 如果您的数据本质上是对象,则使用对象存储(“ NoSQL”)。它们将比关系数据库快得多。 如果您的数据本质上是关系型的,那么关系数据库的开销是值得的。 从- http://seldo.com/weblog/2011/06/15/orm_is_an_antipattern 那么,我怎么知道我的数据是关系型的还是面向对象的呢?

7
使用可为空的外键代替创建交集表的缺点
说我有以下ER图: 现在,如果我使用Schoolin 的外键表示关系Student,则可以具有NULL值(因为a Student 不需要属于a School),例如: 因此,正确的方法(基于我所读的内容)是创建一个交集表来表示这种关系,例如: 这样,NULL表格中就不会出现任何值School_has_Student。 但是,使用可为空的外键而不是创建交集表的缺点是什么? 编辑: 我误选了(school_id,student_id)是用于主键School_has_Student表,这使得许多关系到多。正确的主键应该是student_id:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.