目前我有这样的表: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。
关于python - 使用Python集合类型实现ACL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/790613/