python - 我应该使用哪种数据库模型在运行时动态修改实体/属性?

标签 python database dynamic sqlalchemy redis

我正在考虑为各种类型的数据创建一个开源数据管理Web应用程序。

特权用户必须能够

  • 添加新的实体类型(例如“用户”或“家庭”)
  • 向实体类型添加新属性(例如,将“gender”添加到“user”)
  • 删除/修改实体和属性

  • 这些将是特权用户的常见任务。他将通过应用程序的Web界面执行此操作。最后,所有数据必须可由应用程序的所有类型的用户搜索和排序。有两个问题困扰我:

    a)数据应如何存储在数据库中?我是否应该在运行时动态添加/删除数据库表和/或列?

    我不是数据库专家。我的想象力在于,在关系数据库方面,应用程序必须能够在运行时动态添加/删除表(实体)和/或列(属性)。我不喜欢这个主意。同样,我在考虑是否应在NoSQL数据库中处理此类动态数据。

    无论如何,我相信这种问题有一个智能的规范解决方案,到目前为止我还没有找到和想到。这种动态数据管理的最佳方法是什么?

    b)如何使用ORM或NoSQL在Python中实现?

    如果您建议使用关系数据库模型,那么我想使用SQLAlchemy。但是,我看不到如何在运行时使用ORM动态创建表/列。这就是为什么我希望有一种比在运行时创建表和列更好的方法的原因之一。推荐的数据库模型是否可以使用SQLAlchemy有效实现?

    如果您建议使用NoSQL数据库,哪一个?我喜欢使用Redis-您能想象基于Redis的高效实现吗?

    感谢您的建议!

    编辑以回应一些评论:

    这个想法是某个实体(“表”)的所有实例(“行”)共享同一组属性/属性(“列”)。但是,如果某些实例的某些属性/属性为空值,则将是完全有效的。

    基本上,用户将通过网站上的简单表格搜索数据。他们查询例如具有属性P的实体E的所有实例的值V都比T高。结果可以按任何属性的值排序。

    数据集不会太大。因此,我认为即使是最愚蠢的方法也将导致系统正常运行。但是,我是一个狂热者,我想应用现代和适当的技术,也想知道理论上的瓶颈。我想使用该项目来收集设计“Pythonic”,最新,可扩展且可靠的Web应用程序的经验。

    我看到第一条评论倾向于推荐NoSQL方法。尽管我真的很喜欢Redis,但是如果不利用Mongo / Couch的Document / Collection模型看起来很愚蠢。我一直在研究用于Python的mongodb和mongoengine。这样,我是否朝正确的方向迈出了一步?

    编辑2以响应一些答案/评论:

    从大多数答案中,我得出结论,在关系图中动态创建/删除表和列是而不是。这已经是有值(value)的信息。而且,一种观点认为,动态修改实体和属性的整个想法可能是错误的设计。

    正是因为这种动态特性应成为应用程序的主要目的/功能,所以我不会放弃这一点。从理论上讲,我接受在动态数据模型上执行操作必须比在静态数据模型上执行操作慢。很好

    以抽象方式表示,应用程序需要管理
  • 数据布局,即有效实体类型的“动态列表”和每种有效实体类型的属性的“动态列表”
  • 数据本身

  • 我正在寻找一种智能高效的方法来实现这一目标。从您的答案看来,NoSQL似乎是解决之道,这是另一个重要结论。

    最佳答案

    因此,如果将实体概念化为“文档”,那么整个问题就可以很好地映射到无SQL解决方案上。如前所述,您将需要一个模型层位于文档存储的顶部,并执行诸如验证之类的任务,并可能执行(或鼓励)某种模式,因为没有隐式的后端要求,即同一集合(与表平行)共享架构。

    允许特权用户更改您的架构概念(而不是仅向单个文档中添加字段-这很容易支持)将带来一些挑战-您将必须处理现有数据的迁移以自动匹配新架构。

    阅读您的编辑内容后,Mongo支持所需的搜索/排序方式,并为您提供所需的“空单元格”(缺少特定键的文档)的支持。

    如果我是您(并且我当时正在开发类似但更简单的产品),我会坚持使用Mongo,并研究像Flask这样的轻量级Web框架来提供前端。您可以自己提供模型,但不会与框架的隐式建模选择抗衡。

    关于python - 我应该使用哪种数据库模型在运行时动态修改实体/属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10672939/

    相关文章:

    mysql - 如何仅更改单个表的自动增量偏移量和步长值?

    database - Yii2 + Redis 作为数据库

    python - 将数字和字符串列表转换为单个字符串 python

    python - Pandas:如何使用查询来选择最接近的值

    python - 我可以使用 mixin 组合基于 Create 和 List 类的通用 View 吗?

    java - 使用 Groovy 动态更改 Java 应用程序的行为

    c++ - 读入动态创建的指向结构数组的指针

    python - 如何在 pandas 中保存字典的字典(或具有类似功能的东西)?

    php - 数据库输出阻止图像

    c# - 动态添加组合框中的项目和用户添加的项目应该是永久的而不使用数据库,可能吗?