Socrates / docs / pyCon2010 / introduction.tex

\chapter{简介}

\section{背景}

在软件开发的经历中,关系型数据库给我带来了很大的便利。它提供了静态类型
的强类型结构化存储方案。多种可选的竞争产品,带来了高度通用的信息管理能
力,和各种优秀的特色功能。但是,在复杂多变的软件开发工作中,也体验到很
多不便。

\subsection{关系型数据库的问题}

同一个表的所有记录必须拥有同一类型结构。虽然现代数据库产品出现了各种变
通的表结构定义方式,如表继承等。但仍然脱离不了静态结构、强类型的范畴。

类似游戏道具这样的数据,会有各种复杂的变体,往往会有一些特定的属性,如
特效、镶嵌、附魔等,只有特定的一小部分物品有。而变化种类却非常多。通常
说这是游戏的魅力所在,但是也使得数据存入关系型数据库有一定的困难。往往
需要各种变通的手段。某些关系型数据库产品可能实现了此类稀疏矩阵的存储优
化,但仍然需要一个很大的字段列表。需要添加新的字段时,如果记录比较多,
性能非常糟糕,而且会产生很高级别的锁定。 \footnote{对于游戏,添加新
  的,具有独特属性的物品是非常重要的升级内容。}

关系数据库擅长以表为单位,根据定义式的SQL语句进行批量处理。或者定义表
和表——即同构数据的集合间的关系。我们有时候会更希望针对某个独立的数据,
操作它的值,或者处理关系。\footnote{现在流行的各种ORM对于解决此类问题
  作出了很大贡献},特别是复杂的图结构,往往比较难用关系模 型描述。
\footnote{多对多的节点-边定式在一定程度上解决了这个问题}
\subsection{动态数据结构的启发}

在使用Delphi/C\#等静态语言几年后,我学到了 Python。这对我是一个非常非常
大的震动和启发。由此我开始思考动态数据结构的持久化。我希望这种实现应该
是一个真正的数据库方案,面向数据描述,适于检索,可以描述动态多变的数据
结构和节点间关系。\footnote{相对而言,Python 内置的 pickle 更适合传输
  以及小数据量的,面向单个对象的存储。}

最直观的实现方法就是文本描述的字典,例如 JSON 就是一个非常好的切入点,
但是 JSON 存储于关系型数据库时,往往只能作为文本,不能很方便的依据内容
进行检索\footnote{在此推荐优秀的开源关系型数据库 PostgreSQL,它拥有
  近乎无限的扩展能力。}。另一方面,节点之间的关系描述也不能说很方便。
可以通过 URI 文本表达关联节点的位置,但是这需要应用层的解释。

同样的问题也体现在 XML 上,XML 的标记属性功能使得它可以更方便的分离元
信息与数据。但是这两种格式都不能有效的表达节点间关系描述,以及,在存储
和使用非文本格式时,都不够高效。

Key-value 数据库或许可以令我们想到字典,这是动态数据结构的最直观表示。
但是 KV 数据库是与此非常不同的东西。每个存储节点本身成为一个巨大的字典。
而不是我们期待的,大量小数据结构的统一管理。

\subsection{三值逻辑}

在中国的IT杂志《程序员》上读到一篇文章,标题为《屹立于关系数据库之上的
语义网模型》。这篇文章启发了我,可以通过某种逻辑将原子数据关联起来。形
成一种有层次的动态结构。经过一段时间的尝试以后,我建立了一种基于三元素
结构的逻辑表达方式,Socrates 即是此三值逻辑体系的实现。

Socrates 的逻辑体系有两个层次:条目和语句。每个条目是描述同一个主语的
一组(主语,谓语,宾语)语句集合。

\begin{figure}[htp]
  \centering
  \begin{pspicture}(0, 0)(7, 3)
    \rput(0,1){\rnode{subject}{主语}}
    \rput(4,0){\rnode{predicate0}{谓语}}
    \rput(7,0){\rnode{object0}{宾语}}
    \rput(4,1){\rnode{predicate1}{谓语}}
    \rput(7,1){\rnode{object1}{宾语}}
    \rput(4,2){\rnode{predicate2}{谓语}}
    \rput(7,2){\rnode{object2}{宾语}}

    \ncline{->}{subject}{predicate0}
    \ncline{->}{predicate0}{object0}
    \ncline{->}{subject}{predicate1}
    \ncline{->}{predicate1}{object1}
    \ncline{->}{subject}{predicate2}
    \ncline{->}{predicate2}{object2}
  \end{pspicture}
  \caption{三值逻辑}
\end{figure}
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.