2.8. UUIDを使ったidの管理

web2pyでは単一システムでの idのユニーク性は保証されています。しかし分散システムでは、システム同士が連携を取る仕組み がないのであれば、当然ユニーク性は保証されません。しかし統制がない分散システム上でも、id のユニーク性を確保する方法 があります。それが UUID を使ったid管理です。

UUIDはサーバ毎に重複しないユニークな番号を生成します。UUIDは参考ページで簡単に説明しています。

参考: UUIDとは

web2py にてUUIDを使ってidを管理する場合、次のようにモデルを変更します。

元のモデル

db.define_table('person',
    Field('name'),format='%(name)s')
db.define_table('dog',
    Field('owner_id', db.person),
    Field('name'))

UUIDを利用したモデル

import uuid
db.define_table('person',
    Field('uuid', length=64, default=lambda:str(uuid.uuid4())),
    Field('name'),
    format='%(name)s')

db.define_table('dog',
    Field('uuid', length=64, default=lambda:str(uuid.uuid4())),
    Field('owner_id', length=64),
    Field('name'))

db.dog.owner_id.requires = IS_IN_DB(db,'person.uuid','%(name)s')

テーブルには、idフィールド以外にUUIDのフィールドを追加します。他のテーブルへの参照用フィールド(サンプルでは owner_id)は、 UUIDフィールドと同じ長さに変更します。

UUIDを使ったモデルに対する、レコードの挿入サンプルを示します。

id = uuid.uuid4()
db.person.insert(name='Comoceta', uuid=id)
db.dog.insert(owner_id=id, name='Soducomo')

他のテーブルへの参照用フィールドは値が自動設定されないため、バリデータの設置やプログラムを使って制御する必要があります。

データ読み出しに関しても 再帰的select は利用できないため、 テーブル結合(join) やプログラムでの読み出しを行う 必要があります。

詳細は参考ページにサンプルも含めて書かれています。参照ください。

参考: CSV and Remote Database SynchronizationCSVとリモート・データベースの同期