重要槪念
SDB基本结构图如图3-21所示。

SDB基本结构图中包含了SDB中以下几个最重要的概念。
1.用户账户(CustomerAccout)
使用任何Amazon的云计算服务都需要一个Amazon的账户,SDB也不例外。用户账户就相当于全集,而具体的数据库则相当于子集。
2.域(Domain)
域是数据容器,由于SDB的数据都是以UTF-8编码的字符串形式存储的,因此域是具有一定关联关系的字符串容器。用户账户中的域名必须是唯一的且域名长度至少为3个字符,最长不能超过255个字符。SDB对于域的限制比较宽松,根据规定,一个账户可以最多拥有100个域,而每个域的大小则可以达到10GB。创建域的目的一般来说是将不同特征的数据分开,有些数据本身就具有可分性,我们可以直接将其划分在不同的域, 而像Web数据这类本身不好划分的数据Amazon建议利用哈希函数将其散列到不同的域中。不过在哈希函数的选择时一定要慎重,因为哈希函数一个很大的问题就是散列地址冲突,在数据集较大时频繁地处理冲突问题会使效率大大降低。SDB的数据库操作都是以域为基本单位的,即所有的査询都只可以在一个域内进行,域间操作是不允许的。这是-个比较麻烦的限制,从目前来看,Amazon并没有要解除这个限制的迹象,因此只能由客户端自行解决这个问题。在非必要的情况下最好不要创建新的域,一方面是跨域操作的限制,另一方面是由于建域消耗的时间和相关资源较多。
3.条目(Item)
条目就是一个实际的对象,在SDB中,用一系列的属性来描述这个对象,也就是说条目是属性的集合,而且条目名必须是域内唯一的。SDB不需要事先定义相关的模式(Schema),这是SDB和传统的数据库最大的不同之一。正因为这种差异使得SDB在操作上具有极大的灵活性,用户可以随时创建、删除以及修改条目的内容。条目和条目之间可以属于一类,也可以是完全不相关的两类,这在关系数据库一般也是不允许出现的。
4.属性(Attribute)
属性是条目的特征,它是一个抽象的概念,每个属性都是对条目某一个方面特性的概括性描述。每个条目可以有多个属性,SDB将域内的属性总数限制为10亿。属性的操作也是异常自由的,当某个条目有新的属性时只需要简单地将这个新属性添加进去即可,不用考虑这个属性和其他的条目是否相关。
5.值(Value)
每个条目的某个属性的具体内容就是值,每个条目的所有值可以使用户对于该条目有一个具体、形象的了解。SDB的值相对于关系数据库而言有一个很实用的改进,那就是允许多值属性。关系数据库中一个字段是不允许有多个值的,但在现实生活中这种情况却是经常发生。比如有两个计算机键盘,它们除了颜色是黑色和白色的区别之外其他参数完全一致,在SDB中我们就可以很方便地在颜色属性这一栏中填入黑色、白色而不用担心出错。需要特别注意的是,每个属性值的大小不能超过1KB,这个限制使得SDB存储的数据范围极其有限。出现这种情况应该是Amazon刻意为之,Amazon希望用户将相对大的数据存储在S3中,在SDB中只保存指向某个特定文件位置的指针。
SDB和关系型数据库有很多相同之处,但也有很大的不同,用户在决定使用SDB时绝不能简单地将SDB和关系型数据库做类比。其实严格地说,如果将传统的关系数据库看成一张张表,SDB更像我们平时常接触到的文件夹的树状结构而不是表结构。图3-22显示了SDB的树状组织方式。

除了这种结构上的根本性差异外,SDB为了系统的高可用性采取了最终一致性数据模型。SDB还对每次操作设定了一个超时值(目前是5秒),当操作超过这个时间时,系统就会向用户返回一个错误。同时SDB也对关系数据库做了一些有益的改进,比如当用户创建数据库后,SDB会自动对用户添加的数据进行索引,这样在查询某些数据时速度会大大加快。