【问题标题】:Using Python set type to implement ACL使用 Python 集合类型实现 ACL
【发布时间】:2009-04-26 10:37:33
【问题描述】:

目前我有如下表格:Pages, Groups, GroupPage, Users, UserGroup。使用腌制集,我只需 3 个表即可实现相同的功能:Pages, Groups, Users

set 似乎是实现 ACL 的自然选择,因为组和权限相关的操作可以用集合非常自然地表达。如果我将允许/拒绝列表存储为腌制集,它可以消除多对多关系的少量中间表,并允许在没有很多数据库操作的情况下进行权限编辑。

如果人类可读性很重要,我总是可以使用 json 而不是 cPickle 进行序列化,并在 Python 中操作权限列表时使用set。使用 SQL 直接编辑权限的可能性很小。那么这是一个好的设计理念吗?

我们使用 SQLAlchemy 作为 ORM,因此很可能使用 PickleType 列来实现。我不打算存储整个腌制的“资源”记录集,只存储由“资源”主键​​值组成的 set 对象。

【问题讨论】:

    标签: python set acl pickle


    【解决方案1】:

    如果你要腌制集合,你应该找到一个好的对象数据库(比如ZODB)。在纯关系世界中,您的集合存储为 BLOBS,效果很好。尝试在 ORM 情况下腌制集合可能会导致 ORM 映射出现混淆问题,因为它们大多假定纯粹的关系映射没有任何必须解码的 BLOB。

    集合和其他一流的对象确实属于数据库。 ORM 是一种 hack,因为有些人认为关系数据库“更好”,所以我们在映射层中进行 hack。

    使用对象数据库,您会发现事情通常要顺畅得多。


    编辑

    SQLAlchemy 有它自己的序列化器。

    http://www.sqlalchemy.org/docs/05/reference/ext/serializer.html

    这既不是 pickle 也不是 cPickle。但是,因为它需要可扩展,所以它的行为就像泡菜一样。哪个 - 出于您的目的 - 将与您需要的一样快。您不会一直反序列化 ACL。

    【讨论】:

    • 我们正在使用 SQLAlchemy。 PickleType 可以接受吗?它使用pickle还是cPickle?
    【解决方案2】:

    您需要考虑 DBMS 为您提供了什么,以及您需要重新实现哪些功能。 并发问题是一个大问题。有一些竞争条件需要考虑(例如在不同的线程和进程中发生多次写入并覆盖新数据),性能问题(写入策略?如果您的进程崩溃并且丢失数据怎么办?),内存问题(你的权限集有多大?它们都适合 RAM 吗?)。

    如果您有足够的内存并且不必担心并发性,那么您的解决方案可能是一个不错的解决方案。否则我会坚持使用数据库——它会为您解决这些问题,并且已经对它们进行了大量工作以确保它们始终将您的数据从一种一致状态转移到另一种状态。

    【讨论】:

      【解决方案3】:

      我,我会坚持以一种独立于用于访问它的特定编程语言的形式将持久性信息保存在关系数据库中——就像我喜欢 Python 一样(这是一个很多 ),有一天我可能想从其他语言访问该信息,如果我选择 Python 特定的格式...我会后悔吗...

      【讨论】:

        【解决方案4】:

        如果它简化了事情并且您不会对文件进行大量编辑(或者将不经常编辑),我会说去吧。当然,要考虑的第三种选择是使用sqlite 数据库来存储这些东西。有一些工具可以使这些内容易于人类阅读。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-09
          • 2018-02-16
          • 2012-08-27
          • 1970-01-01
          相关资源
          最近更新 更多