目前我有这样的表:Pages, Groups, GroupPage, Users, UserGroup。使用 pickled sets 我可以只用 3 个表实现同样的事情:Pages, Groups, Users。
set 似乎是实现 ACL 的自然选择,因为组和权限相关的操作可以用集合非常自然地表达。如果我将允许/拒绝列表存储为 pickled 集,它可以消除多对多关系的几个中间表,并允许在没有许多数据库操作的情况下进行权限编辑。
如果人类可读性很重要,我总是可以使用 json 而不是 cPickle 进行序列化,并在 Python 中操作权限列表时使用 set。使用 SQL 直接编辑权限的可能性很小。那么这是一个好的设计思路吗?
我们使用 SQLAlchemy 作为 ORM,所以它很可能用 PickleType 列来实现。我不打算存储整个 pickle 的“资源”记录集,只存储由“资源”主键值组成的 set 对象。
请您参考如下方法:
如果你要 pickle 集,你应该找到一个好的对象数据库(比如 ZODB )。在纯关系世界中,您的集合存储为 BLOBS,效果很好。尝试在 ORM 情况下对集合进行 pickle 可能会导致 ORM 映射出现混淆问题,因为它们大多假设没有任何必须解码的 BLOB 的纯关系映射。
集合和其他一等对象实际上属于数据库。 ORM 是一个 hack,因为有些人认为关系数据库“更好”,所以我们 hack 了一个映射层。
使用对象数据库,您会发现事情通常要顺利得多。
编辑
SQLAlchemy 有它自己的序列化器。
http://www.sqlalchemy.org/docs/05/reference/ext/serializer.html
这既不是 pickle 也不是 cPickle。但是,因为它需要可扩展,所以它会表现得像 pickle。哪一个——为了你的目的——将和你需要的一样快。您不会一直反序列化 ACL。
