作家
登录

用Python写一个NoSQL数据库

作者: 来源: 2017-05-18 13:03:15 阅读 我要评论

Relations

本文译自 What is a NoSQL Database? Learn By Writing>

NoSQL 这个词在近些年正变得到处可见. 然则到底 "NoSQL" 指的是什么? 它是若何并且为什么这么竽暌剐用? 在本文, 我们将会经由过程纯 Python (我比较爱好叫它, "轻构造化的伪代码") 写一个 NoSQL 数据库来答复这些问题.

OldSQL

很多情况下, SQL 已经成为 "数据库" (database) 的一个同义词. 实际上, SQL 是 Strctured Query Language 的首字母缩写, 而并非指数据库技巧本身. 更确切地说, 它所指的是大年夜 RDBMS (关系型数据库治理体系, Relational Database Management System ) 中检索数据的一门说话. MySQL, MS SQL Server 和 Oracle 都属于 RDBMS 的个一一员.

RDBMS 中的 R, 即 "Relational" (有关系,接洽关系的), 是个中内容最丰富的部分. 数据经由过程 表 (table) 进行组织, 每张表都是一些由 类型 (type) 相接洽关系的 列 (column) 构成. 所有表, 列及其类的类型被称为数据库的 schema (架构或模式). schema 经由过程每张表的描述信息完全描述了数据库的构造. 比如, 一张叫做 Car 的表可能有以下一些列:

  • Make: a string
  • Model: a string
  • Year: a four-digit number; alternatively, a date
  • Color: a string
  • VIN(Vehicle Identification Number): a string

在一张表中, 每个单一的条目叫做一 行 (row), 或者一条 记录 (record). 为了区分每笔记录, 平日会定义一个 主键 (primary key). 表中的 主键 是个一一列 , 它可以或很多一标识每一行. 在表 Car 中, VIN 是一个天然的主键选择, 因为它可以或许包管每辆车具有独一的标识. 两个不合的行可能会在 Make, Model, Year 和 Color 列上有雷同的值, 然则对于不合的车而言, 肯定会有不合的 VIN. 反之, 只要两行拥有同一个 VIN, 我们不必去检查其他列就可以认为这两行指的的就是同一辆车.

Querying

SQL 可以或许让我们经由过程对数据库进行 query (萌芽) 来获取有效的信息. 萌芽 简单来说, 萌芽就是用一个构造化说话向 RDBMS 提问, 并将其返回的行解释为问题的谜底. 假设数据库表示了美国所有的注册车辆, 为了获取 所有的 记录, 我们可以经由过程在数据库长进行如下的 SQL 萌芽 :

  1. SELECT Make, Model FROM Car; 

将 SQL 大年夜致翻译成中文:

  • "SELECT": "向我展示"
  • "Make, Model": "Make 和 Model 的值"
  • "FROM Car": "对表 Car 中的每一行"

也就是, "向我展示表 Car 每一行中 Make 和 Model 的值". 履行萌芽后, 我们将会获得一些萌芽的结不雅, 个中每个都是 Make 和 Model. 如不雅我们仅关怀在 1994 年注册的车的色彩, 那么可以:

  1. SELECT Color FROM Car WHERE Year = 1994; 

此时, 我们会获得一个类似如下的列表:

  1. Black 
  2. Red 
  3. Red 
  4. White 
  5. Blue 
  6. Black 
  7. White 
  8. Yellow  

下面是我们办事器所需的一些样板代码:

最后, 我们可以经由过程应用表的 (primary key) 主键 , 这里就是 VIN 来指定萌芽一辆车:

  1. SELECT * FROM Car WHERE VIN = '2134AFGER245267' 

主键被定义为独一弗成反复的. 也就是说, 带有某一指定 VIN 的车辆在表中至多只能出现一次. 这一点异常重要,为什么? 来看一个例子:

假设我们正在经营一个汽车补缀的营业. 除了其他一些须要的工作, 我们还须要追踪一辆车的办事汗青, 即在该辆车上所有的修整记录. 那么我们可能会创建包含以下一些列的 ServiceHistory 表:

VIN | Make | Model | Year | Color | Service Performed | Mechanic | Price | Date

膳绫擎这条萌芽语句会返回所指定车辆的属性信息.

如许, 每次当车辆维修今后, 我们就在表中添加新的一行, 并写入该次办事我们做了一些什么工作, 是哪位维修工, 花费若干和办事时光等.

然则等一下, 我们都知道,对于同一辆车而言,所有车辆自身信罕见关的列是不变的。 也就是说,如不雅把我的 Black 2014 Lexus RX 350 修整 10 次的话, 那么即使 Make, Model, Year 和 Color 这些信息并不会改变,每一次仍然反复记录了这些信息. 与无效的反复记录比拟, 一个更合理的做法是对词攀类信息只存储一次, 并在有须要的时刻进行萌芽。

那么该怎么做呢? 我们可以创建第二张表: Vehicle , 它有如下一些列:

 1/9    1 2 3 4 5 6 下一页 尾页

  推荐阅读

  交通银行信息技术管理部副总经理张漫丽:交通银行“大数据+人工智能”应用研究

大年夜数据隐含着巨大年夜的社会、经济、科研价值,已引起了各行各业的高度看重。如不雅能经由过程人工智能技巧有效地组织和应用大年夜数据,将对社会经济和科学研究成长产生巨大年夜的推>>>详细阅读


本文标题:用Python写一个NoSQL数据库

地址:http://www.17bianji.com/lsqh/35303.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)