VIN | Make | Model | Year | Color
如许一来, 对于 ServiceHistory 表, 我们可以精简为如下一些列:
VIN | Service Performed | Mechanic | Price | Date
你可能会问,为什么 VIN 会在两张表中同时出现? 因为我们须要有一个方法来确认在 ServiceHistory 表的 这 辆车指的就是 Vehicle 表中的 那 辆车, 也就是须要确认两张表中的两笔记录所表示的是同一辆车。 如许的话,我们仅须要为每辆车的自身信息存储一次即可. 每次当车辆过来维修的时刻, 我们就在 ServiceHistory 表中创建新的一行, 而不必在 Vehicle 表中添加新的记录。 毕竟, 它们指的是同一辆车。
我们可以经由过程 SQL 萌芽语句来展开 Vehicle 与 ServiceHistory 两张表中包含的隐式关系:
- SELECT Vehicle.Model, Vehicle.Year FROM Vehicle, ServiceHistory WHERE Vehicle.VIN = ServiceHistory.VIN AND ServiceHistory.Price > 75.00;
该萌芽旨在查找维修费用大年夜于 $75.00 的所有车辆的 Model 和 Year. 留意到我们是经由过程匹配 Vehicle 与 ServiceHistory 表中的 VIN 值来筛选知足前提的记录. 返回的将是两张表中相符前提的一些记录, 而 "Vehicle.Model" 与 "Vehicle.Year" , 表示我们只想要 Vehicle 表中的┞封两列.
如不雅我们的数据库没有 索引 (indexes) (精确的应当是 indices), 膳绫擎的萌芽就须要履行 表扫描 (table scan) 来定位匹配萌芽请求的行。 table scan 是按照次序对表中的每一行进行依次检查, 而这平日会异常的慢。 实际上, table scan 实际上是所有萌芽中最慢的。
可以经由过程对列加索引来避免扫描表。 我们可以把索引看做一种数据构造, 它可以或许经由过程预排序让我们在被索引的列上快速地找到一个指定的值 (或指定范围内的一些值). 也就是说, 如不雅我们在 Price 列上有一个索引, 那么就不须要一行一行地半数个表进行扫描来断定其价格是否大年夜于 75.00, 而是只须要应用包含在索引中的信息 “跳” 到第一个价格高于 75.00 的那一行, 并返回随后的每一行(因为索引是有序的, 是以这些行的价格至少是 75.00)。
当应对大年夜量的数据时, 索引是进步萌芽速度弗成或缺的一个对象。当然, 跟所有的工作一样,有得必有掉, 应用索引会导致一些额外的消费: 索引的数据构造会消费内存,而这些内存本可用于数据库中存储数据。这就须要我们衡量其利弊,寻求一个折中的办法, 然则为经常萌芽的列加索引是 异常 常见的做法。
The Clear Box
当我们谈到 NoSQL 数据库的时刻要牢切记住这一点。 当涉及 query 不合类型数据库引擎的才能时, 这也是个中异常重要的一部分。
Schemas
我们已经知道, 一张表的 schema , 描述了列的名字及其所包含数据的类型。它还包含了其他一些信息, 比如哪些列可认为空, 哪些列不许可有反复值, 以及其他对表中列的所有限制信息。 在随便率性时刻一张表只能有一个 schema, 并且 表中的所有行必须遵守 schema 的规定 。
这是一个异常重要的束缚前提。 假设你有一张数据库的表, 琅绫擎稀有以百万计的花费者信息。 你的发卖团队想要添加额外的一些信息 (比如, 用户的年纪), 以期进步他们邮件营销算法的精确度。 这就须要来 alter (更改) 现有的表 -- 添加新的一列。 我们还须要决定是否表中的每一行都请求该列必须有一个值。 平日情况下, 让一个列有值是十分有事理的, 然则这么做的话可能会须要一些我们无法随便马虎获得的信息(比如数据库中每个用户的年纪)。是以在这个层面上,也须要有些衡量之策。
此外,对一个大年夜型数据库做一些改变平日并不是一件小事。为了以防出现缺点,有一个回滚筹划异常重要。但即使是如斯,一旦当 schema 做出改变后,我们也并不老是可以或许撤销这些更改。 schema 的保护可能是 DBA 工作中最艰苦的部分之一。
得益于数据库可以或许检查一张表的 schema (描述了每列包含了什么类型的数据), 像索引如许的高等特点才能够实现, 并且可以或许基于数据做出一个合理的决定计划。 也就是说, 对于一个数据库而言, 一张表其实是一个 “黑盒” (或者说透明的盒子) 的反义词?
Key/Value Stores
畏敲?解它的工作道理,亲自着手写一个吧! 起首来看一下一些简单的设计设法主意:
- 一个 Python 的 dict 作为重要的数据存储
- 仅支撑 string 类型作为键 (key)
- 支撑存储 integer, string 和 list
- 一个应用 ASCLL string 的简单 TCP/IP 办事器用来传递消息
- 一些像 INCREMENT, DELETE , APPEND 和 STATS 如许的高等敕令 (command)
在 “NoSQL” 这个词存在前, 像 memcached 如许的 键/值 数据存储 (Key/Value Data Stores) 无须 table schema 也可供给数据存储的功能。 实际上, 在 K/V 存储时, 根本没有 "表 (table)" 的概念。 只有 键 (keys) 与 值 (values) . 如不雅键值存储听起来比较熟悉的话, 那可能是因为这个概念的构建原则与 Python 的 dict 与 set 相一致: 应用 hash table (哈希表) 来供给基于键的快速数据萌芽。 一个基于 Python 的最原始的 NoSQL 数据库, 简单来说就是一个大年夜的字典 (dictionary) .
有一个基于 ASCII 的 TCP/IP 接口的数据存储有一个好处, 那就是我们应用简单的 telnet 法度榜样即可与办事器进行交互, 并不须要特别的客户端 (尽管这是一个异常好的演习并且只须要 15 行代码即可完成)。
对于我们发送到办事器及其它的返回信息,我们须要一个 “有线格局”。下面是一个简单的解释:
推荐阅读
交通银行信息技术管理部副总经理张漫丽:交通银行“大数据+人工智能”应用研究
大年夜数据隐含着巨大年夜的社会、经济、科研价值,已引起了各行各业的高度看重。如不雅能经由过程人工智能技巧有效地组织和应用大年夜数据,将对社会经济和科学研究成长产生巨大年夜的推>>>详细阅读
本文标题:用Python写一个NoSQL数据库
地址:http://www.17bianji.com/lsqh/35303.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示