SQL数据库是可以确定需求并且鲁棒数据完整性的项目的理想选择。 NOSQL数据库是不相关,不确定或不断发展的数据要求的理想选择,而速度和可扩展性更为重要。用更简单的术语:
>标题-
> firstName-
> lastname-
性别
- >电话
- 电子邮件
- 地址1
- 地址2
- 地址3
- 城市
- 区域
- > zipcode
- 国家
-
问题一:- 很少有人有一个电话号码。我们可能至少需要三个土地线,移动和工作场所,但是我们分配多少人都不重要 - 某人,某个地方会想要更多。让我们创建一个单独的电话表,以便触点可以随心所欲。这也使我们的数据归一化 - 我们不需要无数的联系人null:
contact_id
名称(诸如土地线,移动工作等文本)
- 数字
-
>问题二:我们在电子邮件地址遇到同样的问题,因此让我们创建一个类似的电子邮件表:
- contact_id
名称(诸如家庭电子邮件,工作电子邮件等文本)
地址
-
>问题三:- >我们可能不希望输入(地理)地址,或者我们可能希望输入多个工作,家庭,度假屋等多个地址。因此,我们需要一个新的地址表:
contact_id
- 名称
(诸如家庭,办公室等文本)
地址1
地址2
- 地址3
- 城市
区域
- > zipcode
- 国家
-
我们的原始联系表已减少为:
- id
>标题-
> firstName-
> lastname-
性别
太好了 - 我们有一个归一化数据库,可以存储任何数量的电话号码,电子邮件地址和地址。很遗憾 …
模式很严格
我们没有考虑联系人的中间名,出生日期,公司或工作角色。我们添加了多少个字段都没关系,我们很快会收到有关票据,周年纪念日,关系状态,社交媒体帐户,内部腿部测量,喜欢的奶酪类型等的更新请求。 d可能会创建一个带有名称对对应对的其他数据表。
数据分散
开发人员或系统管理员检查数据库并不容易。程序逻辑也将变得越来越慢,更复杂,因为在具有多个JOIN条款的单个选择语句中检索联系人的数据是不切实际的。 (您可以,但结果将包含电话,电子邮件和地址的每种组合:如果有人有三个电话号码,五个电子邮件和两个地址,则SQL查询将产生30个结果。)
最后,很难进行全文搜索。如果有人输入字符串“ sitepoint”,我们必须检查所有四个表是否是联系人名称,电话,电子邮件或地址的一部分,并相应地对结果进行排名。如果您曾经使用过WordPress的搜索,您将了解可能会令人沮丧。
NOSQL替代
我们的联系数据涉及人们。它们是不可预测的,并且在不同时间有不同的要求。联系人列表将受益于使用NOSQL数据库,该数据库存储在联系人集合中的单个文档中:
在此示例中,我们尚未存储联系人的标题或性别,并且添加了不需要适用于其他任何人的数据。没关系 - 我们的NOSQL数据库不会介意,我们可以随意添加或删除字段。
由于联系人的数据包含在单个文档中,因此我们可以使用单个查询来检索一些或所有信息。全文搜索也更简单;在MongoDB中,我们可以在所有触点上定义一个索引
文本字段使用:
然后使用以下方式执行全文搜索
<span>{
</span> <span>name: [
</span> <span>"Billy", "Bob", "Jones"
</span> <span>],
</span> <span>company: "Fake Goods Corp",
</span> <span>jobtitle: "Vice President of Data Management",
</span> <span>telephone: {
</span> <span>home: "0123456789",
</span> <span>mobile: "9876543210",
</span> <span>work: "2244668800"
</span> <span>},
</span> <span>email: {
</span> <span>personal: "bob@myhomeemail.net",
</span> <span>work: "bob@myworkemail.com"
</span> <span>},
</span> <span>address: {
</span> <span>home: {
</span> <span>line1: "10 Non-Existent Street",
</span> <span>city: "Nowhere",
</span> <span>country: "Australia"
</span> <span>}
</span> <span>},
</span> <span>birthdate: <span>ISODate</span>("1980-01-01T00:00:00.000Z"),
</span> <span>twitter: '@bobsfakeaccount',
</span> <span>note: "Don't trust this guy",
</span> <span>weight: "200lb",
</span> <span>photo: "52e86ad749e0b817d25c8892.jpg"
</span><span>}</span>
db<span>.contact.createIndex({ "$**": "text" });</span>
方案二:社交网络db<span>.contact.find({
</span> <span>$text: { $search: "something" }
</span><span>});</span>
社交网络可以使用类似的联系数据存储,但它在功能集上扩展了与关系链接,状态更新,消息传递和“喜欢”之类的选项。这些设施可以通过用户需求来实施并放弃 - 不可能预测它们将如何发展。
此外:
大多数数据更新都有一个原始点:用户。我们不太可能一次更新两个或多个记录,因此不需要类似于交易的功能。>- 尽管有些用户可能会想到,但状态更新失败不太可能导致全球崩溃或财务损失。该应用程序的界面和性能比强大的数据完整性更高。
NOSQL似乎很合适。该数据库允许我们快速实施存储不同类型数据的功能。例如,所有用户的日期状态更新都可以放在状态集合中的单个文档中:
尽管该文档可能会很长,但我们可以获取数组的一个子集,例如最新更新。也可以快速搜索每个用户的整个状态历史记录。
现在,假设我们在发布更新时想引入表情符号选择。这将是对更新数组中的新条目添加图形引用的问题。与SQL商店不同,无需将以前的消息情绪设置为NULL - 如果未设置表情符号,我们的程序逻辑可以显示默认值或没有图像。
<span>{
</span> <span>name: [
</span> <span>"Billy", "Bob", "Jones"
</span> <span>],
</span> <span>company: "Fake Goods Corp",
</span> <span>jobtitle: "Vice President of Data Management",
</span> <span>telephone: {
</span> <span>home: "0123456789",
</span> <span>mobile: "9876543210",
</span> <span>work: "2244668800"
</span> <span>},
</span> <span>email: {
</span> <span>personal: "bob@myhomeemail.net",
</span> <span>work: "bob@myworkemail.com"
</span> <span>},
</span> <span>address: {
</span> <span>home: {
</span> <span>line1: "10 Non-Existent Street",
</span> <span>city: "Nowhere",
</span> <span>country: "Australia"
</span> <span>}
</span> <span>},
</span> <span>birthdate: <span>ISODate</span>("1980-01-01T00:00:00.000Z"),
</span> <span>twitter: '@bobsfakeaccount',
</span> <span>note: "Don't trust this guy",
</span> <span>weight: "200lb",
</span> <span>photo: "52e86ad749e0b817d25c8892.jpg"
</span><span>}</span>
方案三:仓库管理系统
考虑一个监视仓库商品的系统。我们需要记录:
>到达仓库并分配给特定位置/海湾- 的产品
仓库内的货物运动,例如重新安排库存,因此相同的产品在相邻的位置-
订单和随后从仓库中删除产品以进行交付。
-
我们的数据要求:
可以存储
通用产品信息,例如盒子数量,尺寸和颜色,但是我们可以识别并应用于任何东西的离散数据。我们不太可能关注细节,例如笔记本电脑处理器速度或估计的智能手机电池寿命。
>必须最大程度地减少错误。我们不能让产品消失或移至已经存储不同产品的位置。- >
以最简单的形式,我们正在记录项目从一个物理区域到另一个物理区域的转移 - 或从位置A删除并放置位置B。这是相同动作的两个更新。
我们需要一个具有强大的数据完整性和交易支持的强大商店。只有SQL数据库(当前)才能满足这些要求。
揭露自己!
我希望这些方案有所帮助,但是每个项目都不同,最终您需要做出自己的决定。 (尽管我们的开发人员都擅长证明我们的技术选择,而不管他们有多好!))
最佳建议:使自己了解尽可能多的技术。这些知识将使您对SQL或NOSQL做出理性和情感公正的判断。祝您好运。
经常询问有关SQL vs nosql
的问题(常见问题解答)
> SQL和NOSQL数据库之间的关键差异是什么?
sql和NOSQL数据库在几种方面有所不同。 SQL数据库是关系的,这意味着它们在表和行中组织了数据。他们使用结构化查询语言(SQL)来定义和操纵数据。另一方面,NOSQL数据库是非依赖的,可以以几种方式存储数据:基于文档的,基于列,基于图形或键值对。它们对于使用大量分布式数据特别有用。>我何时应该在nosql?
sql数据库上使用SQL,当您具有清晰的架构并且数据完整性为时是一个不错的选择最重要的。当您需要执行复杂的查询时,它们也很有益。 SQL数据库是酸性的,可确保可靠的交易。>
何时NOSQL比SQL?
nosql数据库是一个更好的选择。随着时间的流逝不清楚或变化。它们提供了灵活性,可伸缩性和速度,使其成为实时应用程序和大数据的理想选择。可以在同一项目中进行SQL和NOSQL共存吗?可以在同一项目中共存。这被称为多语言持久性体系结构。数据库的选择取决于您应用程序每个部分的特定要求。>
有哪些流行的SQL和NOSQL数据库?流行的SQL数据库包括MySQL,Oracle和PostgreSQL。流行的NOSQL数据库包括MongoDB,Cassandra和Redis。桌子和关系。在NOSQL数据库中,可以根据NOSQL数据库的类型进行多种方式进行数据建模:文档,键值,列或图形。 > sql数据库通常通过添加更强大的硬件来垂直扩展,而NOSQL数据库通过添加更多服务器来处理更多的服务器来缩放流量。
什么是CAP定理,它如何适用于SQL和NOSQL?
cap定理指出,分布式数据存储不可能同时提供以下三个保证中的两个以上的保证:一致性,可用性,可用性,可用性和分区耐受性。 SQL数据库优先级一致性和可用性,而NOSQL数据库优先考虑可用性和分区耐受性。>
> sql和nosql如何处理交易?
用于交易。另一方面,NOSQL数据库通常不提供所有酸性。取而代之的是,他们专注于基础(基本上可用,柔软的状态,最终是一致)。行交易,例如会计系统或需要复杂查询的系统。 NOSQL数据库非常适合需要处理大量数据并水平扩展的应用程序,例如内容管理系统,实时分析和IoT应用程序。