我正在考虑为各种类型的数据创建一个开源数据管理 Web 应用程序。
特权用户必须能够
- 添加新的实体类型(例如“用户”或“家庭”)
- 向实体类型添加新属性(例如“性别”到“用户”)
- 删除/修改实体和属性
这些将是特权用户的常见任务。他将通过应用程序的 Web 界面执行此操作。最后,所有数据都必须可供应用程序的所有类型的用户搜索和排序。有两个问题困扰我:
a) 数据应该如何存储在数据库中?我应该在运行时动态添加/删除数据库表和/或列吗?
我不是数据库专家。我一直在想,就关系数据库而言,应用程序必须能够在运行时动态添加/删除表(实体)和/或列(属性)。我不喜欢这个主意。同样,我正在考虑是否应该在 NoSQL 数据库中处理此类动态数据。
无论如何,我相信这类问题有一个智能的规范解决方案,这是我迄今为止没有找到和想到的。这种动态数据管理的最佳方法是什么?
b) 如何使用 ORM 或 NoSQL 在 Python 中实现这一点?
如果您推荐使用关系数据库模型,那么我想使用 SQLAlchemy。但是,我看不到如何在运行时使用 ORM 动态创建表/列。这就是为什么我希望有一种比在运行时创建表和列更好的方法的原因之一。推荐的数据库模型是否可以使用 SQLAlchemy 有效实现?
如果您推荐使用 NoSQL 数据库,是哪一个?我喜欢使用 Redis——你能想象一个基于 Redis 的高效实现吗?
感谢您的建议!
编辑以回应一些评论:
这个想法是某个实体(“表”)的所有实例(“行”)共享同一组属性/属性(“列”)。但是,如果某些实例的某些属性/属性具有空值,则它将是完全有效的。
基本上,用户将通过网站上的简单表格搜索数据。例如,它们查询具有属性 P 的实体 E 的所有实例,该属性 P 的值 V 高于 T。结果可以按任何属性的值排序。
数据集不会变得太大。因此,我认为即使是最愚蠢的方法仍然会导致工作系统。但是,我是一名爱好者,我想应用现代和适当的技术,同时我想了解理论瓶颈。我想使用这个项目来收集设计“Pythonic”、最先进、可扩展且可靠的 Web 应用程序的经验。
我看到第一条评论倾向于推荐 NoSQL 方法。虽然我真的很喜欢 Redis,但不利用 Mongo/Couch 的 Document/Collection 模型似乎很愚蠢。我一直在研究 Python 的 mongodb 和 mongoengine。通过这样做,我是否朝着正确的方向迈出了一步?
编辑 2 以回应一些答案/评论:
从您的大多数答案中,我得出结论,在关系图中动态创建/删除表和列不是要走的路。这已经是有价值的信息。此外,一种观点是,动态修改实体和属性的整个想法可能是糟糕的设计。
由于这种动态特性应该是应用程序的主要目的/功能,我不会放弃这一点。从理论的角度来看,我接受在动态数据模型上执行操作必然比在静态数据模型上执行操作慢。这完全没问题。
用抽象的方式表达,应用程序需要管理
- 数据布局,即有效实体类型的“动态列表”和每个有效实体类型的属性“动态列表”
- 数据本身
我正在寻找一种智能且有效的方法来实现这一点。从您的回答看来,NoSQL 似乎是这里的出路,这是另一个重要的结论。