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

特权用户必须能够

  • 添加新实体类型(例如,"用户"或"族")
  • 将新属性添加到实体类型(例如,将"性别"添加到"用户")
  • 删除/修改实体和属性

这些将是特权用户的常见任务.他将通过应用程序的web界面来实现这一点.最后,应用程序的所有类型的用户都必须能够搜索和排序所有数据.有两个问题困扰着我:

a) How should the data be stored in the database? Should I dynamically add/remove database tables and/or columns during runtime?

我不是数据库专家.我一直认为,就关系数据库而言,应用程序必须能够在运行时动态添加/删除表(实体)和/或列(属性).我不喜欢这个主意.同样,我在考虑是否应该在NoSQL数据库中处理这样的动态数据.

不管怎么说,我相信这类问题有一个智能的规范解决方案,这是我到目前为止还没有发现和想到的.What is the best approach for this kind of dynamic data management?

b) How to implement this in Python using an ORM or NoSQL?

如果您推荐使用关系数据库模型,那么我想使用SQLAlChemy.但是,我不知道如何在运行时使用ORM动态创建表/列.这就是为什么我希望有比在运行时创建表和列更好的方法的原因之一.Is the recommended database model efficiently implementable with SQLAlchemy?

如果您推荐使用NoSQL数据库,请 Select 哪个?我喜欢用Redis--can you imagine an efficient implementation based on Redis?

谢谢你的建议!

Edit in response to some comments:

其思想是,某个实体("表")的所有实例("行")共享同一组属性("列").但是,如果某些实例的某些属性/属性的值为空,则它将完全有效.

基本上,用户将通过网站上的一个简单表单来搜索数据.例如,他们查询属性P值V大于T的实体e的所有实例.结果可以按任何属性的值排序.

数据集不会变得太大.因此,我认为即使是最愚蠢的做法,也会带来一个有效的制度.然而,我是一个爱好者,我想要应用现代和适当的技术,同时我也想知道理论上的瓶颈.我想用这个项目来积累设计一个"Pythonic"的、最先进的、可伸缩的和可靠的Web应用程序的经验.

我发现最初的 comments 倾向于推荐NoSQL方法.虽然我真的很喜欢Redis,但不利用Mongo/Coach的文档/收集模型似乎是愚蠢的.我一直在为Python研究mongodb和mongoengine.通过这样做,我是否朝着正确的方向迈出了一步?

Edit 2 in response to some answers/comments:

从您的大多数回答中,我得出结论,动态创建/删除关系图中的表和列是一条可行之路.这已经是有价值的信息了.还有一种观点认为,动态修改实体和属性的整个 idea 可能是糟糕的设计.

正因为这种动态特性应该是应用程序的主要目的/特性,所以我不会放弃这一点.从理论的Angular 来看,我同意在动态数据模型上执行操作一定比在静态数据模型上执行操作慢.这完全没问题.

以抽象的方式表示,应用程序需要管理

  1. data layout,即有效实体类型的"动态列表"和每个有效实体类型的属性的"动态列表
  2. 百人组

我正在寻找一种智能高效的方法来实现这一点.从你们的回答来看,NoSQL似乎是解决这个问题的方法,这是另一个重要结论.

推荐答案

因此,如果您将实体概念化为"文档",那么整个问题将很好地映射到非SQL解决方案.如上所述,您将需要某种类型的模型层,该层位于文档存储的顶部并执行诸如验证之类的任务,并且可能强制(或鼓励)某种类型的模式,因为没有隐含的后端要求同一集合(与表平行)中的实体必须共享模式.

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

阅读您的编辑,Mongo支持您正在寻找的那种搜索/排序,并将为您提供所需的"空单元格"(缺少特定键的文档)支持.

如果我是你(我现在碰巧在开发一个类似的,但更简单的产品),我会坚持使用Mongo,并研究一个像Flask这样的轻量级Web框架来提供前端.您将自己提供模型,但您不会反对框架的隐式建模 Select .

Database相关问答推荐

聚合以过滤 MongoDB 中的引用

任何必要的可空外键示例?

生产中的超大型 Mnesia 表

如何打印出 sequelize 实例的表名?

数据库模式 - location

Mysql - 在所有数据库中查找表

使用 SQLAlchemy Core 批量插入列表值

Postgres pg_dump 每次都以不同的顺序转储数据库

Android - SQLite 数据库存储在哪里?

如何最好地在 MS SQL Server 中复制整个数据库?

外键可以作为主键吗?

如何在 Play 2.0 中 for each 环境设置不同的数据库?

设置默认数据库连接 Rails

每个 Docker 容器一个或多个数据库

customer客户表的数据库 struct ,每个客户有很多订单,每个订单有很多商品

如何在磁盘上布局 B-Tree 数据?

conflict serializable和conflict equivalent有什么区别?

如何在 Windows 中将用户添加到 PostgreSQL?

唯一(多列)并且在一列中为空

无需安装的轻量级 SQL 数据库