`
daogangtang
  • 浏览: 62921 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Bamboo存储抽象层与外键关系的讨论

阅读更多
Bamboo的存储抽象层主要在model.lua中实现。本文仅从使用的角度来说明Bamboo中的存储抽象层的内容。

建立模型时,bamboo的域的属性由域属性表描述。根据是否是外链到其它对象的角度,可以把域分为两种:普通域和外键域。而这两者,是由如下两个属性名称来区分的。

foreign

外链模型名称,如果这个属性不存在。则表明是普通字段。如果存在,表明是外链字段。是外链字段的话,foreign只能取如下几个值中的一个。
  • 'Model_name',即模型的名字,具体使用的时候,要用具体的模型名称来替换Model_name,比如:'User';
  • 'UNFIXED',不定模型。它的意思是,同一个外键域中可以存储多个不同的模型的实例。比如:'User:1', 'ZDUser:5' ...;
  • 'ANYSTRING',任意字符串。它的意思是,存入外键队列的不是一个实例对象的索引了,而是被压成字符串的对象。

st

存储类型(store type)。如果这个属性不存在,就默认存储类型为'ONE',如果存在,只能取如下列表中的一个(目前来讲有4个):
  • 'ONE'。对单外键。在内部,以字符串形式存储在对象实例的中的此域的key对应的value中;
  • 'MANY'。对多外键。在内部,以zset的形式存储。其中,score就为添加时的index(添加一个自动加1),存储的内容由foreign的类型确定,可以保证的是单个元素都为字符串;
  • 'FIFO'。对多外键,但与MANY不同的是,FIFO是固定长度的,默认是100,可由fifolen属性重新定义。在内部,是以list的形式存储,当数据填满的时候,就会执行先进先出的操作。
  • 'ZFIFO'。对多外键。与FIFO相同的地方在于,两者长度都是确定的,默认是100,可由fifolen属性重新定义。不同的地方在于,在内部,是以zset的形式存储,score为内部根据目前最大的score值得到,value为对象字符串,由foreign属性决定。

foreign与st组合,(目前)可以产生3*4=12种情形(以后可能更多)。

index cache

除了外键的存储用到了redis的高级结构,在Model实例保存的时候,还会生成一个index cache,用的是zset。存储的时候,以每个实例的id为score,以name为member存入。这个index cache在整个模型的高速API设计中起到了相当重要的作用。

模型外键的完整解决方案

外键分为一对一,一对多,多对多三种,同时又有正向、反向两个方向。
  • 一对一关系,正向反向都是单个指向。
  • 一对多关系,正向是多个指向,反向是单个指向。
  • 多对多关系,正向是多个指向,反向是单个指向。

在Bamboo的模型实现中,对上面情况的处理方式是在域描述表里面写属性:
  • 一对一正向:foreign=’model B’, st=’ONE’
  • 一对一反向:foreign=’model A’, st=’ONE’
  • 一对多正向:foreign=’model B’, st=’MANY’
  • 一对多反向:foreign=’model A’, st=’ONE’
  • 多对多正向:foreign=’model B’, st=’MANY’
  • 多对多反向:foreign=’model A’, st=’MANY’

在域描述表里面写明后,还得需要相应的方法来操作它们,Bamboo提供了一套完整的API:

● instance:addForeign(field_name, obj)

向本对象的某一个外键域中添加新对象的连
接(实际就是存储这个新对象的id值)。可以看出,要先获得new_obj才行;

● instance:getForeign(field_name [, start [, stop [, is_rev]]])

获得本对象的外键对象。对于单外键的情况,返回的是那个外键对象;对于多外键的,返回的是那些外键对象的列表。可以用start和stop参数来决定获取多外键的某一个切片。

● instance:delForeign(field_name, obj)

删除一个外键。可以看出,要先获得待删除的外键对象才行。

在外键的定义的时候,一个完整的外键关系实际是需要正反双方共同完成,即正向反向都要定义。但正向反向都定义的话,会导致增加域。所以,很多时候,只用得到一半关系,有可能是正向的一半,也有可能是反向的一半。由于有一半关系的存在,因此,当删除一个模型的对象的时候,引用这个外键对象的另一个模型的那个对象,可能根本无法知道。于是自动化的删除管理就是一件非常困难的事情,这也是数据库系统中历来最头痛的一件事情。

鉴于这种困难,Bamboo把外键删除的工作交由用户自己来管理。用户根据自己的业务逻辑小心地处理一个对象删除后,其它相关引用对象外键去留的问题。不过,Bamboo还是做了一小点事情来帮助用户稍微释放一下紧绷的神经,当使用getForeign()函数的时候,如果发现,要获取的外键对象不存在时,会自己将此条外键记录清除掉。这个方式仍然有局限,那就是,只有当调用getForeign()函数时,这种清除工作才会发生。想要像垃圾回收器那样自动进行外键回收清理,目前是不可能的。
1
1
分享到:
评论

相关推荐

    java~主外键关系

    Java~主外键关系~有图解~主外键关系~主外键关系

    Access中如何建立外键关系

    在Microsoft Access中,通过外键关系可以实现表之间的链接,使得一个表的数据能够引用另一个表的数据。下面我们将详细介绍在Access中如何建立外键关系。 首先,我们需要创建三个基础表:`Course`、`Student`和`SC`...

    根据主外键关系递归生成drop语句

    根据主外键关系递归生成drop语句,请在plsql developer中执行

    hibernate一对一外键关系

    本文将深入探讨Hibernate中的一对一外键关系,这对于初学者来说是非常重要的概念。 一对一(One-to-One)关系是数据库设计中的一个基本关系类型,表示两个实体之间存在唯一的对应关系。例如,在员工管理系统中,一...

    外键以实体实现的在三层.rar

    在这个上下文中,"外键以实体实现"指的是在业务逻辑层和数据访问层中,使用对象关系映射(ORM)技术来处理数据库中的外键关系。 首先,我们需要理解外键的概念。外键是数据库设计中的一个重要概念,它用于在一个表...

    Mysql增加外键的方法

    总之,通过上述的知识点介绍,我们可以了解到,在MySQL中建立外键并不复杂,关键是要确保数据表的存储引擎是InnoDB,并且要正确设置外键与主键的数据类型,同时还需要注意外键的触发限制条件。只有在实际的操作中...

    django外键关系的model互相读取数据.docx

    在这个例子中,我们有三个模型:`Blog`、`Author`和`Entry`,它们之间存在外键(ForeignKey)和多对多(ManyToManyField)的关系。 首先,让我们详细了解这三个模型: 1. **Blog模型**: - `name`: 一个最大长度...

    在标准的三层架构中用GridViwe显示数据库外键的数据

    外键是数据库设计中的一个重要概念,用于维护表之间的关系,通常用于实现一对多或多对多的关系。在ASP.NET中,我们可以通过以下步骤实现: 1. **创建数据模型**:根据数据库结构,创建对应的实体类,包括外键字段。...

    MySQL创建数据表并建立主外键关系详解

    MySQL创建数据表并建立主外键关系是数据库设计中常见的操作,这对于数据的一致性和完整性至关重要。主键和外键是关系型数据库中的关键概念,它们用于确保数据的关联性和引用完整性。 首先,让我们理解一下主键和...

    oracle查看主外键约束关系

    在数据库设计中,主外键关系是用来维护数据一致性和完整性的重要手段。主键用于唯一标识表中的每条记录,而外键则用于在不同表之间建立关联,确保数据的引用完整性。下面将详细介绍如何通过SQL语句查看Oracle数据库...

    主键与外键的创建

    本文将深入探讨主键与外键的创建,帮助初学者更好地理解这两个概念。 **主键(Primary Key)**是用于唯一标识数据库表中每条记录的字段或一组字段。主键的特性包括: 1. 唯一性:主键的值在表中必须是唯一的,不...

    对Django外键关系的描述

    在本篇文章中,我们将深入探讨Django框架中与外键相关的几种模型关系:一对一(OneToOneField)、一对多(OneToManyField)以及多对多(ManyToManyField)关系。这些关系是Django ORM的重要组成部分,它们能够帮助开发者...

    SQLServer生成所有外键存储过程

    描述中提到的"SQLServer生成所有外键存储过程"是一个专门设计的存储过程,它的目标是在不违反外键约束的情况下,批量地将数据库中所有表的varchar字段转换为Nvarchar。这是因为varchar只能存储非Unicode字符,而...

    mysql外键的添加与删除参考.pdf

    MySQL 外键的添加与删除参考 MySQL 外键是关系数据库管理系统中的一种约束机制,它能够确保数据的一致性和完整性。外键是指在一个表中字段的值必须存在于另一个表中的字段值中。MySQL 中的外键只能在 InnoDB 存储...

    关系模型Relational Model,主键Primary Key,外键Foreign Key【关系数据库SQL教程2】

    关系模型Relational_Model,主键Primary_Key,外键Foreign_Key【关系数据库SQL教程2】

    hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向

    在上面的配置中, `<many-to-one>` 标签指定了Person实体与IdCard实体之间的一对一唯一外键关联关系,其中unique="true"指定了多的一端的多重性为一。 Hibernate 一对一唯一外键关联映射的应用 在实际应用中,一对...

    关于关系型数据库基本知识(主键、外键、一对一、一对多、多对一等).docx

    关系型数据库是现代数据存储和管理的核心,它采用关系模型,将数据组织成二维表格的形式。关系模型由关系、元组、属性、域和关键字等基本概念构成。关系即为表格,元组代表表格中的一行,属性表示一列,域指属性的...

    数据表的关联关系图-父表与子表的关联关系

    本话题主要讨论的是“数据表的关联关系图”,特别是父表与子表的关联关系,涉及到的核心概念包括主键、外键、父表和子表,以及多对一关联。 首先,我们来理解什么是主键和外键。主键(Primary Key)是表中的一个或...

    深入理解数据库关系:主键与外键的选择与应用

    主键和外键是数据库设计中不可或缺的部分。正确选择和使用它们可以确保数据的完整性、一致性和安全性。在实际开发中,应根据业务需求和数据模型仔细设计主键和外键,以实现最优的数据管理和性能。 本文通过详细解释...

Global site tag (gtag.js) - Google Analytics