设计数据密集型应用之数据系统基础知识

第一章

可靠性

针对系统的容错设计,提高系统错误的抛出率,而不是忽略它(除了安全这种不可恢复类型的),尽量避免failure

硬件错误

  1. 硬件自身容许设计
  2. 软件系统的灵活性与弹性。即容许整台机器异常,而不影响系统

软件错误

  1. 影响范围大,连锁反应,排查难。bug,依赖服务错误等
  2. 避免:考虑全面,全面测试,处理隔离,监控

人类错误

  1. 最小化犯错机会的方式设计系统,全面测试,允许从错误中恢复,监控

Scaliability(可扩展性)

  1. Load描述,又称load parameters:CPU, 内存,网络等因素,这取决于系统的设计

  2. 性能描述:通常使用percentiles(百分位数),99th, 98th等。

    • 监控度量percentiles: 使用计算窗口,即保存窗口时间内的数据,并计算排序。其他算法,forwar decay、t-digits等也可
  3. 应对Load:

    • 纵向扩展:升级到更高性能的机器
    • 水平扩展:将Load分摊到多台相似的虚拟机上
  4. 扩展性是针对特定的假设来设计的,而假设可能是错误的。因此在应用初期,应该采取功能快速迭代的方式,而非基于假设的去支持扩展

Maintainability(可维护性)

  1. Operability,可操作&运维性:提供监控指标、文档、好的默认配置、好的工具等
  2. Simplicity,Managing Complexity:通过抽象降低复杂度
  3. Evolvability,Making Change Easy:敏捷的工作模式,TDD,重构

第二章:数据模型和查询语言

关系型模型VS文档型模型

  • 一对多关系:关系型使用外键;而文档型使用JSON-LIKE来表示树状结构(更方便)
  • 多对一、多对多:两者并无区别,都是使用relation model(a relation(table) is simply a collection of tuples(rows))而非network)(hierachical) model(with access path)
  • 对比:
    • shcema灵活度:文档型更佳(schema-on-read),数据结构是隐式的,只有读取时才会翻译出来。于关系型(write-on-read)
    • 查询局部性优化:文档型更佳。关系型也能支持

数据的查询语言

  • 声明式,例如SQL(database)、CSS&HTML(web),MapReduce(分组聚合,例如mongDB中的aggregate)。
  • 命令式,例如通过函数查询。声明式更为推荐

图数据模型

对于多对多较多,我们一般使用关系型模型,然而随着数据之间联系变得复杂,数据模型为图模型则更佳

属性图

在属性图模型中,每个顶点(vertex)包括:

  • 唯一的标识符
  • 一组 出边(outgoing edges)
  • 一组 入边(ingoing edges)
  • 一组属性(键值对)

每条 边(edge) 包括:

  • 唯一标识符
  • 边的起点/尾部顶点(tail vertex)
  • 边的终点/头部顶点(head vertex)
  • 描述两个顶点之间关系类型的标签
  • 一组属性(键值对)

Cypher声明式查询语言,语法方便简洁。举例

MATCH
	(person) -[:BORN_IN]->  () -[:WITHIN*0..]-> (us:Location {name:'United States'}),
	(person) -[:LIVES_IN]-> () -[:WITHIN*0..]-> (eu:Location {name:'Europe'})
RETURN person.name

Triple-Stores and SPARQL

三元组模型:(subject, predicate, object),(主,谓,宾)结构。例如(Jim, likes, bananas)

DataLog

是上述Cypher以及SPARQL之类查询语言的基础。通过在查询中组合以及递归重用相同的规则来实现查询,尤其针对复杂查询

小结

  • 演化:one big tree(hierarchical) -> relation-model(because of many-to-many) -> NoSQL -> Graph
  • 文档数据库通常应用于one-many或者无关系的数据场景
  • 而图数据库,则应用于任何数据都可能与其他数据有关系(与文档数据库都是schema less)
  • 尽管一种模型可以模拟另外一种模型,但是实际用起来往往很糟糕。因此要选择合适的

第三章 存储与检索

常见存储模型:log-structured, page-oriented

使用append-only data file的模式,可快速实现一个数据库,很多数据库都使用这一原理。

  • 更新或者添加记录,都会在文件末尾append一条log。写入性能优
  • 然而查询时,需要遍历所有记录。读取性能差
  • 因此不得不引入索引,索引是一种取自原始数据(一般是元信息)额外的数据结构。
  • 但是维护索引需要额外性能,尤其是写入时。因此需要根据查询模式,构建索引,达到权衡

HASH Index

使用hash表来存储索引(in-memory),其中键为实际key, 值为文件中实际记录的offset。

如何处理磁盘空间不足?将log文件划分为多个指定长度文件段(segment),当达到长度阈值时,则起一个后台线程进行压缩,并同时合并不同的segment

其他实践细节

  • 文件格式。使用2进制
  • 删除记录。删除时,标记为tombstore(假删除),在合并压缩过程进行实际删除
  • crash recovery。通过保存索引的快照,实现快速重启。
  • Partially written records。支持checksum,可检测并忽略异常部分
  • 并发控制。写操作保持同步,只允许一个线程进行写操作

Why append-only file 而不是直接更改文件

  • 写操作总是有序的,可避免乱序写,从而提升性能(磁盘硬件原因,磁道扫描等)
  • 并发和异常崩溃更简单
  • 压缩合并机制可避免存储容量问题

缺点

  • Hash table 必须in memory。因此大量key-value等情况难以适合,尽管能利用磁盘,但是会大大提升复杂度并降低性能
  • range queries 效率低

SSTables and LSM-Trees

更改文件格式,将所有segments中的键值对按照键进行排序。从而改进append-only file模式

优点

  1. 合并segments非常简单且高效。使用归并排序的算法实现,且当存在同名key,我们保留最近segment中的key
  2. 无需将索引的keys都保存在内存中。大可只保留部分key的索引,依然key是有序的,则只需找到目前key前后的两个key的索引,获取offset在期间扫描即可
  3. 提高写入性能。我们可以将记录分组,然后在写入前压缩
  4. range query 效率很高

构建与维护

我们在内存中维护SSTable,通过使用树管理(红黑树、AVL-Tree)

  1. 在写入时,添加到tree中。in-memory tree called a memtable

  2. 当memtable大于一定阈值时,则将其作为SStable file保存在磁盘中(期间,我们新起一个memetable实例)

  3. 在读取时,按照memtable->recent SSTable file-> older-SSTable file的属性查找

  4. 在一定的时机,进行合并与压缩

缺点

  1. 意外崩溃时,会造成in-memory memtable内容丢失。可通过额外一个的append-only log file来避免

性能优化点

  1. Slow when looking up keys tha do not exist in the database. 可通过Boolm filters来解决
  2. 压缩合并的时机。分为size-tired以及leveled两种策略

B-Trees

B-trees break the database into fixed-size blocks or pages.

Each page can be identified using an address or location。a B-tree with n kesy always has a depth of O(logn)。

使B-tree更可靠

  1. 由于b-tree在写入时,是直接修改page的,期间发生崩溃容易造成一些异常(例如,孤儿页)。引入redo log
  2. 并发控制,

优化

  1. 页中只存储key的摘要,节省空间
  2. pages能被放置在磁盘任意位置。为避免,会在写入时,重新排布tree。
  3. 添加额外的指针,例如连接叶子页,从而避免过多的跳转

其他索引

  • primary key index。例如标识关系数据库中的row,图数据库中的顶点
  • secondary indexes。例如关系数据库中以某列(user_id)作为索引。很容易通过key-value索引构建
  • index中存储值。例如聚簇索引(indexed row store in index),覆盖索引(聚簇&非聚簇的折中,存indexed row的部分列)
  • 多列索引。concatenated index(连接索引), 将多个列组合而成,只能按照前后顺序生效
  • multi-dimensional(多维索引)。更为通用
  • 全文搜索和模糊索引;内存数据库

事务处理或分析?

数据处理模式。

  • OLTP(online trasaction processing)。常见于交易、登录等事务,面向用户
  • OLAP(online transaction processing)。报表分析、聚合等,面向分析人员

Data Warehousing

OLTP系统通常需要保持高可用、低延迟,而直接对OLTP所用的数据库查询分析,容易产生不良影响。且OLTP相关数据库的索引也往往不适合OLAP

ETL(extract-transform-load):Warehouse将其他系统的数据收集过来,转换analysis-friendly模式,清理并加载导入到data warehouse

 

小公司业务量小,并不需要整套系统,简单SQL、报表分析工具都可以。

Schemas for Analytics

  • star schema: 实际的表处于中心,被它不同维度的信息表包围,它们之间的连接就如同星星
  • Snowflake schema: star schema的扩展,将周围表划分为更多的子维度表(少用)

Column-Oriented Storage

将所有的值按照列区分开并各自单独存储在一起,而非将所有列的值合并为行存储。

因为分析往往只针对个别列,以行为维度存储会读取不必要的列数据

例如,

column_1_key file contents: 1,2,3

column_2_key file contents: tom,jerry,john

Column Comparession

使用bitmap encoding技术

列存储的排序

排序后,有助于压缩,以及查询

列存储的写入

所有的写入,首先会写入内存,添加到一个排序好的结构中,然后准备被写入磁盘(而非像B-Tree一样直接修改pages)

聚合

Materiablized view: 针对sum、count等一类聚合后的结果数据的缓存。

Data cubes: 多维度的聚合缓存优化(例如商品的名称、购买日期两个维度,构成一个data cubes)。针对特定的查询很快(预先计算好了),例如每年的购买商品量

第四章-编码与更新

应用总是在不断更新的,而相关的数据自然也得不断更新。同样,数据格式的更更新也会导致关联应用代码的更新。而应用代码的更新往往更麻烦。

为满足making change easy,我们必须让数据的更新满足,向前兼容以及向后兼容。

数据编码的格式

编码(encoding),将数据从内存表示转换为字节序列的过程。反之,称为解码(decoding)

语言特定格式

语言内置的编码格式,例如Python中的pickle等。通常不建议

JSON, XML, and Binary Variants

json, xml都是文本编码,且能自解释的,可读行非常高。

缺点:

  • 数据类型缺乏,例如JSON不能区分整数、浮点数
  • 不支持二进制类型,不得不用base64转换,而这将导致增加额外33%的数据大小

题外话,这跟让不同组织达成一致相比都不是缺点:)

二进制变体,如BSON, BJSON等

Trift and Protocol Buffers

当用于组织内部时,推广二进制编码往往没那么多压力。失去了可读性,但是体积更小,编解码更快

Thrift BinaryProtocol

 

Thrift CompactProtocol(与Protocol Buffers基本相同)

 

两者相对比:

  • CompactProtocol体积更小
  • 使用field tag替换字段名
  • 使用variable-length表示数字。每个字节的头个位用来表示后续字节是否同属该数字值

注意,required以及optional标记,只在运行时校验。数据表示均一致。

字段更新时

  • 可任意更改字段名,而不能更改tag number。
  • 添加一个字段:
    • 向前兼容:老代码会直接忽略该字段
    • 向后兼容:新字段必须为optional或者有默认值,以便读到老的数据时,可以忽略或取默认

字段类型更新时

  • 会有丢失数据或丧失精度的风险。例如整数,32bit -> 64bit。64读到32位填充0,32读到64无法满足而丢弃置空
  • ProtobufProtocol中的repeated标记表示同样的field tag出现若干次,可兼容optional

Avro

 

相较上述Thrift、Protobuf,它没有field tag或者field name,因此必须使用相同的schema来读写。

写入端&读取端,可拥有不同的schema,对于兼容性,可使用default value以及版本号来解决

动态生成schema

Avro可支持动态生成schema,可以方便地通过JSON,数据库表结构等直接生成Acro结构。

而ProtocolBufferdeng则不得不手动修改field tag与列名的映射

数据流的模型

Dataflow Through Databases

写入<->未来读取

向后兼容,否则的话未来的代码将不能读取之前的数据

向前兼容,老的代码可能会使用到新的数据,例如滚动升级

兼容性

数据的写入时间不同,Rewriting(migrationg)的方式,或者填入默认值(使用Avro模型)

使用归档存储

Dataflow Through Services

请求<->返回

多用于在网络之中的传输,例如web service与client,service与service(SOA, 微服务)。

SOAP,REST

  • REST更为广泛,路径代表资源,HTTP动词代表操作
  • SOAP则使用XML来定义

REST也是源自RPC,不过相较RPC,其不像RPC一样把调用当错内部函数,而更像是个网络协议。

REST用于OPENAPI, 而RPC往往只能用在组织内部。

兼容性

服务端只需要针对request做向后兼容,对response做向前兼容。

  • gRPC之类的使用内置的编码格式做兼容
  • SOAP使用XML schema做兼容
  • RESTful API使用增加可选请求参数,在返回体中添加新字段。最终可使用版本号

Message-Passing Dataflow

可以看做为异步消息传递系统

相较于RPC拥有BUffer作为缓存,提高可靠性。自动重传消息等等

message broker

RabbitMQ, Kafka等等。消息传递给querytopic,broker确保消息传递给了consumerssubscribers

数据格式:字节序列即可,JSON, ProtoBuf均可。

分布式actor框架

以message broker作为桥梁,连接各个actor,从而提升扩展性,降低复杂性,避免线程、锁等

https://wj.qq.com/s2/7015582/3963
https://wj.qq.com/s2/7015877/871c
https://bitbucket.org/bmbkbfjkk/workspace/projects/PVQG03G
https://wj.qq.com/s2/7014159/dfe0
https://wj.qq.com/s2/7017251/cf52
https://wj.qq.com/s2/7013327/e324
https://bitbucket.org/DHJJJJFHHF/workspace/projects/TDZ7C0N
https://wj.qq.com/s2/7029631/4897
https://bitbucket.org/DHJJJJFHHF/workspace/projects/JHHVXXL
https://wj.qq.com/s2/7011159/f96d
https://bitbucket.org/bmbkbfjkk/workspace/projects/EDJOZGC
https://bitbucket.org/bmbkbfjkk/workspace/projects/JQT7E36
https://wj.qq.com/s2/7030532/9130
https://wj.qq.com/s2/7015468/e58a
https://bitbucket.org/bmbkbfjkk/workspace/projects/NPB8P8R
https://bitbucket.org/bmbkbfjkk/workspace/projects/GN3L842
https://bitbucket.org/bmbkbfjkk/workspace/projects/OB99R5Z
https://wj.qq.com/s2/7011698/b580
https://bitbucket.org/DHJJJJFHHF/workspace/projects/MZFM4V2
https://bitbucket.org/bmbkbfjkk/workspace/projects/ECCEDGZ
https://bitbucket.org/DHJJJJFHHF/workspace/projects/VOL6X4C
https://wj.qq.com/s2/7015868/546b
https://wj.qq.com/s2/7015362/ea80
https://wj.qq.com/s2/7031941/4679
https://bitbucket.org/bmbkbfjkk/workspace/projects/XPGQ88W
https://wj.qq.com/s2/7032502/037d
https://wj.qq.com/s2/7033731/9418
https://bitbucket.org/DHJJJJFHHF/workspace/projects/UTMVR8V
https://bitbucket.org/bmbkbfjkk/workspace/projects/FXRH3X9
https://bitbucket.org/bmbkbfjkk/workspace/projects/PLHA841
https://wj.qq.com/s2/7017342/f49d
https://bitbucket.org/DHJJJJFHHF/workspace/projects/FY0MW1E
https://bitbucket.org/DHJJJJFHHF/workspace/projects/BQ050D8
https://wj.qq.com/s2/7015112/2f9c
https://wj.qq.com/s/7011930/dab9/
https://bitbucket.org/DHJJJJFHHF/workspace/projects/RMP1L4P
https://wj.qq.com/s2/7031624/7be7
https://bitbucket.org/DHJJJJFHHF/workspace/projects/MAEAAYQ
https://wj.qq.com/s2/7015800/3ef8
https://bitbucket.org/DHJJJJFHHF/workspace/projects/UXSHQP4
https://bitbucket.org/DHJJJJFHHF/workspace/projects/IBXBITC
https://wj.qq.com/s2/7014677/80ca
https://wj.qq.com/s2/7014441/949b
https://bitbucket.org/bmbkbfjkk/workspace/projects/PTDIQZX
https://wj.qq.com/s2/7033079/3517
https://wj.qq.com/s2/7015156/52e8
https://wj.qq.com/s2/7015977/6a2b
https://bitbucket.org/DHJJJJFHHF/workspace/projects/RWH4072
https://bitbucket.org/bmbkbfjkk/workspace/projects/VZ2T230
https://wj.qq.com/s2/7033594/8c00
https://bitbucket.org/bmbkbfjkk/workspace/projects/YJE689P
https://wj.qq.com/s2/7031962/d2a8
https://wj.qq.com/s2/7015609/5154
https://bitbucket.org/bmbkbfjkk/workspace/projects/IU61PA5
https://bitbucket.org/DHJJJJFHHF/workspace/projects/KQ6W2O8
https://bitbucket.org/bmbkbfjkk/workspace/projects/CCCIYCU
https://bitbucket.org/bmbkbfjkk/workspace/projects/FV7FAO2
https://bitbucket.org/bmbkbfjkk/workspace/projects/OIQQSTB
https://bitbucket.org/DHJJJJFHHF/workspace/projects/WXEZ6W3
https://bitbucket.org/DHJJJJFHHF/workspace/projects/DL5SSAJ
https://wj.qq.com/s2/7029643/ff64
https://wj.qq.com/s2/7031896/9a4c
https://bitbucket.org/DHJJJJFHHF/workspace/projects/EPIYCDS
https://bitbucket.org/bmbkbfjkk/workspace/projects/KXURVXY
https://wj.qq.com/s2/7016844/5b07
https://bitbucket.org/bmbkbfjkk/workspace/projects/DW1DX85
https://bitbucket.org/DHJJJJFHHF/workspace/projects/OXH5N1G
https://wj.qq.com/s2/7032142/0f46
https://wj.qq.com/s2/7013932/746d
https://wj.qq.com/s2/7015818/380b
https://bitbucket.org/bmbkbfjkk/workspace/projects/PL8PGE3
https://bitbucket.org/DHJJJJFHHF/workspace/projects/JGL3N98
https://wj.qq.com/s2/7032313/ddc5
https://wj.qq.com/s2/7015176/35f8
https://wj.qq.com/s2/7033627/4f84
https://bitbucket.org/DHJJJJFHHF/workspace/projects/MMO82MW
https://bitbucket.org/DHJJJJFHHF/workspace/projects/VRSD0Q4
https://bitbucket.org/bmbkbfjkk/workspace/projects/RIDSOYK
https://bitbucket.org/DHJJJJFHHF/workspace/projects/QMI651X
https://wj.qq.com/s2/7017210/6db4
https://wj.qq.com/s2/7013481/c5ba
https://wj.qq.com/s2/7015914/35b4
https://wj.qq.com/s2/7033520/ef07
https://bitbucket.org/bmbkbfjkk/workspace/projects/SZ8I51Z
https://bitbucket.org/bmbkbfjkk/workspace/projects/QO7FU8L
https://bitbucket.org/DHJJJJFHHF/workspace/projects/KM77AXV
https://bitbucket.org/DHJJJJFHHF/workspace/projects/JP99SAK
https://bitbucket.org/bmbkbfjkk/workspace/projects/PWBYZGF
https://bitbucket.org/bmbkbfjkk/workspace/projects/VRJMMDE
https://wj.qq.com/s2/7032277/54e2
https://wj.qq.com/s2/7031981/1986
https://bitbucket.org/DHJJJJFHHF/workspace/projects/GEO04QF
https://wj.qq.com/s2/7030844/05ad
https://wj.qq.com/s2/7017961/1fb3
https://bitbucket.org/DHJJJJFHHF/workspace/projects/ST7CO98
https://wj.qq.com/s2/7032623/df5c
https://wj.qq.com/s2/7013943/98a4
https://wj.qq.com/s2/7017487/7374
https://bitbucket.org/DHJJJJFHHF/workspace/projects/NAXL530
https://wj.qq.com/s2/7012491/4713
https://wj.qq.com/s2/7032636/613f
https://bitbucket.org/DHJJJJFHHF/workspace/projects/KORM52Y
https://wj.qq.com/s2/7016847/1fca
https://bitbucket.org/DHJJJJFHHF/workspace/projects/PM8KRFN
https://wj.qq.com/s2/7012334/57c1
https://wj.qq.com/s2/7016758/eeee
https://bitbucket.org/DHJJJJFHHF/workspace/projects/RVHULYK
https://bitbucket.org/DHJJJJFHHF/workspace/projects/MOK43TS
https://bitbucket.org/bmbkbfjkk/workspace/projects/AOOBDB8
https://bitbucket.org/DHJJJJFHHF/workspace/projects/DY05W18
https://bitbucket.org/bmbkbfjkk/workspace/projects/EJEK18Q
https://wj.qq.com/s2/7015345/825d
https://wj.qq.com/s2/7032088/f07c
https://wj.qq.com/s2/7030683/6adc
https://bitbucket.org/bmbkbfjkk/workspace/projects/OAZ6M39
https://bitbucket.org/DHJJJJFHHF/workspace/projects/DQLXZBR
https://bitbucket.org/bmbkbfjkk/workspace/projects/MJ7DVGA
https://bitbucket.org/DHJJJJFHHF/workspace/projects/VD60C45
https://bitbucket.org/bmbkbfjkk/workspace/projects/DC602H9
https://wj.qq.com/s2/7011961/cd20
https://bitbucket.org/bmbkbfjkk/workspace/projects/NP9V1VJ
https://bitbucket.org/bmbkbfjkk/workspace/projects/VQPPUYR
https://bitbucket.org/bmbkbfjkk/workspace/projects/NR5IX60
https://wj.qq.com/s2/7016165/50b0
https://bitbucket.org/bmbkbfjkk/workspace/projects/UQ8YOD7
https://bitbucket.org/DHJJJJFHHF/workspace/projects/LH0O8ZJ
https://wj.qq.com/s2/7015965/ce42
https://wj.qq.com/s2/7016172/65db
https://bitbucket.org/DHJJJJFHHF/workspace/projects/EX1R80W
https://bitbucket.org/DHJJJJFHHF/workspace/projects/CX6CONM
https://bitbucket.org/bmbkbfjkk/workspace/projects/OX80NM1
https://bitbucket.org/DHJJJJFHHF/workspace/projects/ZD5D53T
https://bitbucket.org/DHJJJJFHHF/workspace/projects/GJ5MH54
https://bitbucket.org/bmbkbfjkk/workspace/projects/JUJCGST
https://bitbucket.org/bmbkbfjkk/workspace/projects/KUTYWE7
https://wj.qq.com/s2/7016219/2c07
https://wj.qq.com/s2/7029761/e81e
https://wj.qq.com/s2/7017356/1733
https://wj.qq.com/s2/7014904/b9ae
https://bitbucket.org/bmbkbfjkk/workspace/projects/BDHZSXQ
https://bitbucket.org/bmbkbfjkk/workspace/projects/TA28312
https://bitbucket.org/DHJJJJFHHF/workspace/projects/BJJGPTO
https://bitbucket.org/bmbkbfjkk/workspace/projects/NESSX4S
https://bitbucket.org/bmbkbfjkk/workspace/projects/ITRR8N3
https://bitbucket.org/bmbkbfjkk/workspace/projects/LBY3OA5
https://wj.qq.com/s2/7031435/fddb
https://bitbucket.org/DHJJJJFHHF/workspace/projects/MG13LG9
https://wj.qq.com/s2/7031183/cd12
https://wj.qq.com/s2/7031951/1204
https://bitbucket.org/DHJJJJFHHF/workspace/projects/RT0JO9T
https://bitbucket.org/bmbkbfjkk/workspace/projects/ET0F2TY
https://wj.qq.com/s/7011488/1c1e/
https://wj.qq.com/s/7011843/80f3/
https://wj.qq.com/s2/7033938/864d
https://wj.qq.com/s2/7017186/74c6
https://wj.qq.com/s2/7011941/cd58
https://bitbucket.org/DHJJJJFHHF/workspace/projects/EJL5ZJR
https://wj.qq.com/s2/7031729/e193
https://wj.qq.com/s/7011641/74c3/
https://wj.qq.com/s2/7011366/1cb0
https://wj.qq.com/s2/7011765/5936
https://bitbucket.org/bmbkbfjkk/workspace/projects/OF4798A
https://bitbucket.org/bmbkbfjkk/workspace/projects/UMRHNYA
https://bitbucket.org/DHJJJJFHHF/workspace/projects/BNEOEPQ
https://bitbucket.org/bmbkbfjkk/workspace/projects/WTB4120
https://wj.qq.com/s2/7016204/aee9
https://wj.qq.com/s2/7013304/c513
https://wj.qq.com/s2/7011760/7df6
https://bitbucket.org/bmbkbfjkk/workspace/projects/NLOIW5B
https://wj.qq.com/s2/7015347/8e61
https://bitbucket.org/DHJJJJFHHF/workspace/projects/JVZBLXX
https://wj.qq.com/s2/7014335/680d
https://bitbucket.org/DHJJJJFHHF/workspace/projects/JFCRBID
https://bitbucket.org/bmbkbfjkk/workspace/projects/IUPKYCL
https://bitbucket.org/DHJJJJFHHF/workspace/projects/DCD825D
https://wj.qq.com/s2/7032332/ad00
https://wj.qq.com/s2/7030781/bbbe
https://wj.qq.com/s2/7013271/c9d7
https://wj.qq.com/s2/7016283/a642
https://bitbucket.org/DHJJJJFHHF/workspace/projects/BWTEA6F
https://wj.qq.com/s2/7032040/075a
https://bitbucket.org/bmbkbfjkk/workspace/projects/GZ4482X
https://bitbucket.org/bmbkbfjkk/workspace/projects/GY7U1JE
https://bitbucket.org/DHJJJJFHHF/workspace/projects/ZCN05LD
https://wj.qq.com/s2/7015512/fe80
https://bitbucket.org/bmbkbfjkk/workspace/projects/SIZU0R1
https://wj.qq.com/s2/7016619/4cc3
https://bitbucket.org/bmbkbfjkk/workspace/projects/VS3TIHO
https://wj.qq.com/s2/7032218/c1f0
https://wj.qq.com/s2/7031265/d22b
https://wj.qq.com/s2/7017181/7410
https://wj.qq.com/s2/7030064/8af9
https://wj.qq.com/s2/7013420/eb6e
https://bitbucket.org/DHJJJJFHHF/workspace/projects/QZHGBDW
https://wj.qq.com/s2/7033211/eb6a
https://bitbucket.org/bmbkbfjkk/workspace/projects/GDC7RG7
https://bitbucket.org/bmbkbfjkk/workspace/projects/TOLMREB
https://bitbucket.org/DHJJJJFHHF/workspace/projects/FZXNYDZ
https://wj.qq.com/s/7011507/6275/
https://bitbucket.org/DHJJJJFHHF/workspace/projects/AV49E9H
https://bitbucket.org/DHJJJJFHHF/workspace/projects/PY4Z3T8
https://bitbucket.org/DHJJJJFHHF/workspace/projects/RRW48MN
https://bitbucket.org/DHJJJJFHHF/workspace/projects/LTZDQXS
https://bitbucket.org/DHJJJJFHHF/workspace/projects/PW0XQS4
https://wj.qq.com/s2/7032349/6d10
https://bitbucket.org/DHJJJJFHHF/workspace/projects/FWDACNY
https://bitbucket.org/DHJJJJFHHF/workspace/projects/DV7280W
https://wj.qq.com/s2/7031248/9ab9
https://bitbucket.org/bmbkbfjkk/workspace/projects/OO0OY0O
https://wj.qq.com/s2/7016221/db7f
https://bitbucket.org/DHJJJJFHHF/workspace/projects/QCX6TZU
https://bitbucket.org/bmbkbfjkk/workspace/projects/TPFXR5T
https://wj.qq.com/s2/7012496/e10d
https://bitbucket.org/bmbkbfjkk/workspace/projects/IIH9I5C
https://wj.qq.com/s2/7031333/fee1
https://wj.qq.com/s/7011872/a3ab/
https://wj.qq.com/s/7011773/4a1c/
https://wj.qq.com/s2/7032479/656a
https://bitbucket.org/DHJJJJFHHF/workspace/projects/SF11P39
https://bitbucket.org/bmbkbfjkk/workspace/projects/QP1AVE5
https://wj.qq.com/s2/7015963/1466
https://bitbucket.org/bmbkbfjkk/workspace/projects/QKLDJOL
https://wj.qq.com/s2/7015219/a233
https://wj.qq.com/s2/7031166/8d2f
https://bitbucket.org/DHJJJJFHHF/workspace/projects/RJNYUN5
https://wj.qq.com/s2/7015720/5d5a
https://bitbucket.org/DHJJJJFHHF/workspace/projects/SZN42N8
https://wj.qq.com/s2/7017460/2d69
https://wj.qq.com/s2/7013819/62a7
https://wj.qq.com/s2/7017855/6711
https://wj.qq.com/s2/7032933/fed4
https://wj.qq.com/s2/7031999/4857
https://wj.qq.com/s2/7031383/9ebc
https://bitbucket.org/DHJJJJFHHF/workspace/projects/YSN03JK
https://wj.qq.com/s2/7012581/89a2
https://wj.qq.com/s2/7017358/7d69
https://bitbucket.org/DHJJJJFHHF/workspace/projects/FH1VHXZ
https://wj.qq.com/s2/7014815/94a5
https://wj.qq.com/s2/7029932/0367
https://wj.qq.com/s2/7016964/fdf2
https://wj.qq.com/s2/7030763/21eb
https://bitbucket.org/bmbkbfjkk/workspace/projects/DANMTQB
https://bitbucket.org/bmbkbfjkk/workspace/projects/WE739W3
https://bitbucket.org/bmbkbfjkk/workspace/projects/NQM49R4
https://bitbucket.org/DHJJJJFHHF/workspace/projects/OLHBAOG
https://wj.qq.com/s2/7033240/a4eb
https://wj.qq.com/s2/7031598/e6e4
https://bitbucket.org/bmbkbfjkk/workspace/projects/HLWAHFS
https://wj.qq.com/s2/7011896/9013
https://wj.qq.com/s2/7016098/631c
https://wj.qq.com/s2/7030485/8cf0
https://wj.qq.com/s2/7015418/5b24
https://wj.qq.com/s2/7033035/85d6
https://wj.qq.com/s2/7014984/be9a
https://wj.qq.com/s2/7031883/f675
https://bitbucket.org/DHJJJJFHHF/workspace/projects/GLRRPWD
https://wj.qq.com/s2/7011347/e014
https://wj.qq.com/s2/7032159/b598
https://wj.qq.com/s2/7029962/8abc
https://bitbucket.org/bmbkbfjkk/workspace/projects/QMQTXQM
https://bitbucket.org/bmbkbfjkk/workspace/projects/MR74W3Y
https://wj.qq.com/s2/7032504/fb6e
https://wj.qq.com/s2/7029434/2278
https://bitbucket.org/DHJJJJFHHF/workspace/projects/LOGIJWR
https://wj.qq.com/s2/7029917/02eb
https://bitbucket.org/bmbkbfjkk/workspace/projects/JTD7Y16
https://bitbucket.org/bmbkbfjkk/workspace/projects/HE5Q08K
https://bitbucket.org/DHJJJJFHHF/workspace/projects/VMXGZSB
https://wj.qq.com/s2/7013117/e8a6
https://wj.qq.com/s2/7031964/400d
https://wj.qq.com/s2/7029821/8451
https://wj.qq.com/s2/7015317/8201
https://wj.qq.com/s2/7029419/571b
https://wj.qq.com/s2/7031447/c78a
https://wj.qq.com/s2/7032618/3b95
https://bitbucket.org/DHJJJJFHHF/workspace/projects/JHL7TH7
https://wj.qq.com/s2/7031702/6ff8
https://bitbucket.org/bmbkbfjkk/workspace/projects/MLX76R1
https://bitbucket.org/bmbkbfjkk/workspace/projects/YALL3GC
https://wj.qq.com/s/7011271/5f5e/
https://bitbucket.org/DHJJJJFHHF/workspace/projects/CIDLKQE
https://bitbucket.org/DHJJJJFHHF/workspace/projects/LUXH1D9
https://wj.qq.com/s/7011696/df97/
https://wj.qq.com/s2/7011291/338b
https://wj.qq.com/s2/7011766/f472
https://bitbucket.org/bmbkbfjkk/workspace/projects/FK8R5S8
https://wj.qq.com/s2/7011892/282e
https://wj.qq.com/s2/7033306/5f81
https://wj.qq.com/s2/7031224/e3ef
https://bitbucket.org/DHJJJJFHHF/workspace/projects/CH79ZER
https://wj.qq.com/s2/7015191/f7a6
https://wj.qq.com/s2/7031072/bfa0
https://wj.qq.com/s2/7013958/9aa2
https://wj.qq.com/s2/7015047/f675
https://bitbucket.org/DHJJJJFHHF/workspace/projects/BSMRCVU
https://bitbucket.org/DHJJJJFHHF/workspace/projects/XR67IR2
https://wj.qq.com/s2/7033379/cdef
https://wj.qq.com/s2/7015391/24ef
https://bitbucket.org/DHJJJJFHHF/workspace/projects/AK4Z373
https://bitbucket.org/bmbkbfjkk/workspace/projects/VG4MVAD
https://bitbucket.org/DHJJJJFHHF/workspace/projects/NG3G5Z6
https://bitbucket.org/DHJJJJFHHF/workspace/projects/BXL5BNZ
https://bitbucket.org/DHJJJJFHHF/workspace/projects/MNL745K
https://wj.qq.com/s/7011288/2cf3/
https://wj.qq.com/s2/7031730/9fec
https://wj.qq.com/s2/7015746/9404
https://wj.qq.com/s2/7013991/a091
https://bitbucket.org/bmbkbfjkk/workspace/projects/VBUY9WX
https://bitbucket.org/DHJJJJFHHF/workspace/projects/IYQVH71
https://wj.qq.com/s2/7029826/f7a8
https://wj.qq.com/s2/7030033/db01
https://bitbucket.org/bmbkbfjkk/workspace/projects/XCME154
https://wj.qq.com/s2/7033724/c42c
https://wj.qq.com/s2/7014668/8981
https://bitbucket.org/bmbkbfjkk/workspace/projects/AU6BP24
https://wj.qq.com/s2/7012672/ce6f
https://bitbucket.org/bmbkbfjkk/workspace/projects/UY9358Q
https://wj.qq.com/s2/7014790/0869
https://bitbucket.org/DHJJJJFHHF/workspace/projects/DGRGUIE
https://wj.qq.com/s2/7032305/e409
https://wj.qq.com/s2/7033212/b41f
https://wj.qq.com/s2/7017766/325d
https://bitbucket.org/DHJJJJFHHF/workspace/projects/MRXSWKI
https://bitbucket.org/DHJJJJFHHF/workspace/projects/NFFWK89
https://bitbucket.org/bmbkbfjkk/workspace/projects/MJUHWRI
https://wj.qq.com/s2/7014380/be6a
https://bitbucket.org/DHJJJJFHHF/workspace/projects/ADC24CZ
https://bitbucket.org/bmbkbfjkk/workspace/projects/WGUU6K0
https://wj.qq.com/s2/7015433/1a86
https://wj.qq.com/s2/7029701/6ecb
https://bitbucket.org/bmbkbfjkk/workspace/projects/ZW53U10
https://bitbucket.org/bmbkbfjkk/workspace/projects/JHBMMUI
https://wj.qq.com/s2/7029626/0269
https://bitbucket.org/DHJJJJFHHF/workspace/projects/ZOX8A8J
https://wj.qq.com/s2/7029946/f03f
https://bitbucket.org/DHJJJJFHHF/workspace/projects/VQVLO73
https://wj.qq.com/s2/7016186/126f
https://wj.qq.com/s2/7031579/be28
https://bitbucket.org/bmbkbfjkk/workspace/projects/LZPV2M8
https://wj.qq.com/s2/7031862/0dfc
https://bitbucket.org/bmbkbfjkk/workspace/projects/UADMGYV
https://bitbucket.org/DHJJJJFHHF/workspace/projects/LZ823C3
https://bitbucket.org/bmbkbfjkk/workspace/projects/KK7JN29
https://wj.qq.com/s2/7029924/f59a
https://wj.qq.com/s2/7032583/bef4
https://bitbucket.org/bmbkbfjkk/workspace/projects/CVXLOHD
https://wj.qq.com/s2/7029492/f061
https://wj.qq.com/s2/7030462/b0de
https://wj.qq.com/s2/7033858/e68b
https://bitbucket.org/bmbkbfjkk/workspace/projects/PJ9YPMU
https://wj.qq.com/s2/7014858/6b74
https://wj.qq.com/s2/7029563/2d20
https://bitbucket.org/bmbkbfjkk/workspace/projects/RCJTJFH
https://wj.qq.com/s2/7032253/32a3
https://wj.qq.com/s2/7014507/18a7
https://wj.qq.com/s2/7018930/6c4f
https://bitbucket.org/DHJJJJFHHF/workspace/projects/XFWVHHZ
https://wj.qq.com/s2/7017119/3ad9
https://bitbucket.org/bmbkbfjkk/workspace/projects/OO05331
https://wj.qq.com/s/7011593/f527/
https://bitbucket.org/DHJJJJFHHF/workspace/projects/BP59RNN
https://bitbucket.org/DHJJJJFHHF/workspace/projects/KBA7JY9
https://bitbucket.org/bmbkbfjkk/workspace/projects/XNGGLKG
https://wj.qq.com/s2/7016480/784d
https://wj.qq.com/s/7011519/3c34/
https://bitbucket.org/DHJJJJFHHF/workspace/projects/FWYET54
https://wj.qq.com/s2/7015194/d8ac
https://bitbucket.org/bmbkbfjkk/workspace/projects/QPRIW5T
https://wj.qq.com/s2/7014457/3239
https://bitbucket.org/DHJJJJFHHF/workspace/projects/JI2555L
https://wj.qq.com/s2/7015623/24c9
https://bitbucket.org/bmbkbfjkk/workspace/projects/UXP3Y41
https://bitbucket.org/DHJJJJFHHF/workspace/projects/BMCAEGW
https://wj.qq.com/s2/7029451/855f
https://bitbucket.org/DHJJJJFHHF/workspace/projects/XNJQVID
https://wj.qq.com/s2/7029929/7b46
https://wj.qq.com/s2/7030553/c4cd
https://bitbucket.org/bmbkbfjkk/workspace/projects/XSR8IE7
https://bitbucket.org/DHJJJJFHHF/workspace/projects/XW77QVC
https://bitbucket.org/bmbkbfjkk/workspace/projects/GD208LA
https://wj.qq.com/s2/7032649/30f1
https://bitbucket.org/DHJJJJFHHF/workspace/projects/UW163QP
https://bitbucket.org/DHJJJJFHHF/workspace/projects/HUWQ4R0
https://wj.qq.com/s2/7017085/cfbb
https://wj.qq.com/s2/7015502/7af1
https://wj.qq.com/s2/7016497/b2eb
https://wj.qq.com/s2/7031185/f488
https://bitbucket.org/bmbkbfjkk/workspace/projects/UKFUY5A
https://bitbucket.org/bmbkbfjkk/workspace/projects/AOE13PE
https://bitbucket.org/DHJJJJFHHF/workspace/projects/QWON6ZZ
https://bitbucket.org/DHJJJJFHHF/workspace/projects/LNZIZMM
https://wj.qq.com/s2/7030856/66c5
https://wj.qq.com/s/7011574/2f79/
https://wj.qq.com/s2/7015246/6e63
https://bitbucket.org/DHJJJJFHHF/workspace/projects/BXE718C
https://bitbucket.org/bmbkbfjkk/workspace/projects/RSCZY67
https://bitbucket.org/DHJJJJFHHF/workspace/projects/XTBXZIK
https://wj.qq.com/s2/7017363/9613
https://bitbucket.org/bmbkbfjkk/workspace/projects/AIG90W3
https://wj.qq.com/s2/7014490/e2ba
https://wj.qq.com/s2/7012648/0bb8
https://bitbucket.org/DHJJJJFHHF/workspace/projects/EDIOCKO
https://wj.qq.com/s2/7029852/4958
https://bitbucket.org/DHJJJJFHHF/workspace/projects/HY9DQ74
https://bitbucket.org/DHJJJJFHHF/workspace/projects/PIOKYJA
https://bitbucket.org/DHJJJJFHHF/workspace/projects/NDLLOUO
https://bitbucket.org/DHJJJJFHHF/workspace/projects/AM670UM
https://bitbucket.org/DHJJJJFHHF/workspace/projects/QT68BYL
https://wj.qq.com/s2/7015374/ca94
https://wj.qq.com/s2/7030717/dd80
https://wj.qq.com/s2/7033485/ae83
https://bitbucket.org/DHJJJJFHHF/workspace/projects/IU24773
https://bitbucket.org/DHJJJJFHHF/workspace/projects/ZF95359
https://wj.qq.com/s2/7030056/c9e5
https://wj.qq.com/s/7011406/ea03/
https://bitbucket.org/bmbkbfjkk/workspace/projects/NP4Q3TE
https://wj.qq.com/s2/7030071/4d1f
https://bitbucket.org/bmbkbfjkk/workspace/projects/JO44T0Q
https://wj.qq.com/s2/7013447/e5c6
https://bitbucket.org/bmbkbfjkk/workspace/projects/LQB8110
https://wj.qq.com/s2/7031720/6969
https://bitbucket.org/DHJJJJFHHF/workspace/projects/HX5W6D2
https://bitbucket.org/DHJJJJFHHF/workspace/projects/IHKL64N
https://wj.qq.com/s2/7015301/90ee
https://wj.qq.com/s2/7031795/20ca
https://bitbucket.org/DHJJJJFHHF/workspace/projects/FG5I7Q6
https://bitbucket.org/bmbkbfjkk/workspace/projects/LUQICZS
https://bitbucket.org/bmbkbfjkk/workspace/projects/UO99L43
https://bitbucket.org/DHJJJJFHHF/workspace/projects/JOIB70E
https://bitbucket.org/DHJJJJFHHF/workspace/projects/BN6RXOF
https://bitbucket.org/DHJJJJFHHF/workspace/projects/ZHFXP05
https://bitbucket.org/DHJJJJFHHF/workspace/projects/EA57C45
https://bitbucket.org/DHJJJJFHHF/workspace/projects/HPRV798
https://wj.qq.com/s2/7033452/512c
https://bitbucket.org/DHJJJJFHHF/workspace/projects/UXH43FQ
https://bitbucket.org/bmbkbfjkk/workspace/projects/VAVRYPK
https://wj.qq.com/s2/7030121/fcd5
https://bitbucket.org/DHJJJJFHHF/workspace/projects/DO292AF
https://bitbucket.org/DHJJJJFHHF/workspace/projects/HHR3506
https://bitbucket.org/bmbkbfjkk/workspace/projects/CZ4LEXL
https://wj.qq.com/s2/7030241/ee76
https://wj.qq.com/s2/7031150/754f
https://bitbucket.org/bmbkbfjkk/workspace/projects/SK0NM9D
https://wj.qq.com/s2/7016220/b2ae
https://bitbucket.org/bmbkbfjkk/workspace/projects/NHW070E
https://bitbucket.org/bmbkbfjkk/workspace/projects/VPVQJUA
https://wj.qq.com/s/7011553/9f3d/
https://wj.qq.com/s2/7030861/ed7a
https://bitbucket.org/bmbkbfjkk/workspace/projects/GS22M5Q
https://wj.qq.com/s2/7015010/28a2
https://bitbucket.org/DHJJJJFHHF/workspace/projects/EMYNEXZ
https://wj.qq.com/s2/7012434/4e39
https://bitbucket.org/bmbkbfjkk/workspace/projects/ROJR7C3
https://wj.qq.com/s2/7030907/d68e
https://bitbucket.org/bmbkbfjkk/workspace/projects/OM04448
https://bitbucket.org/bmbkbfjkk/workspace/projects/WXYCYGO
https://bitbucket.org/bmbkbfjkk/workspace/projects/BKRROPQ
https://bitbucket.org/DHJJJJFHHF/workspace/projects/YD74EWE
https://wj.qq.com/s2/7014967/beda
https://wj.qq.com/s2/7018935/31c4
https://bitbucket.org/bmbkbfjkk/workspace/projects/UD6RZXL
https://wj.qq.com/s2/7030783/0a5f
https://bitbucket.org/bmbkbfjkk/workspace/projects/UJEA1S3
https://wj.qq.com/s/7011642/3e46/
https://wj.qq.com/s2/7030315/67c1
https://wj.qq.com/s2/7014261/4840
https://wj.qq.com/s/7011866/38fc/
https://wj.qq.com/s2/7013605/62ea
https://bitbucket.org/bmbkbfjkk/workspace/projects/BXQBW60
https://wj.qq.com/s2/7031562/c04b
https://bitbucket.org/bmbkbfjkk/workspace/projects/GXCFPEJ
https://wj.qq.com/s2/7016544/ba3e
https://wj.qq.com/s2/7016418/5c47
https://wj.qq.com/s2/7014859/6ea5
https://wj.qq.com/s2/7016076/c4bd
https://bitbucket.org/bmbkbfjkk/workspace/projects/TJ41Q5L
https://bitbucket.org/bmbkbfjkk/workspace/projects/XS0Z6I7
https://wj.qq.com/s2/7033923/96bb
https://bitbucket.org/bmbkbfjkk/workspace/projects/PL35197
https://wj.qq.com/s2/7016415/78a4
https://bitbucket.org/DHJJJJFHHF/workspace/projects/YHXW9ZJ
https://bitbucket.org/DHJJJJFHHF/workspace/projects/CTH46R2
https://wj.qq.com/s2/7015470/3f28
https://bitbucket.org/bmbkbfjkk/workspace/projects/QB73J1T
https://bitbucket.org/bmbkbfjkk/workspace/projects/XNWW33O
https://bitbucket.org/bmbkbfjkk/workspace/projects/KTODBOD
https://wj.qq.com/s2/7031597/aec9
https://wj.qq.com/s2/7032018/dad7
https://bitbucket.org/DHJJJJFHHF/workspace/projects/OS3RXS0
https://bitbucket.org/DHJJJJFHHF/workspace/projects/UD1NHRZ
https://wj.qq.com/s2/7016049/0dff
https://bitbucket.org/bmbkbfjkk/workspace/projects/TL4E27Z
https://wj.qq.com/s/7011722/6e62/
https://wj.qq.com/s/7011440/6470/
https://wj.qq.com/s2/7031892/e6be
https://bitbucket.org/DHJJJJFHHF/workspace/projects/OQKLU7U
https://bitbucket.org/bmbkbfjkk/workspace/projects/MI1Q562

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据设计文件。这些文件通常包括数据库结构图、数据设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值