【问题标题】:Rails and mysql - adding columns to a table dynamically based upon form valuesRails 和 mysql - 根据表单值动态地将列添加到表中
【发布时间】:2013-01-22 02:56:59
【问题描述】:

我正在开发一个旧版应用程序 - 现在,我们允许管理员生成带有自定义字段的表单(他们创建字段、选择输入类型、标签等)。

当用户填写此自定义表单时,会检查该表单中的所有字段 - 如果该字段不是 users 表中的列,我们会将其作为列添加到 users 表中。

例如,如果管理员添加了一个名为“航班到达时间”的字段,我们将在 users 表中添加一个名为“flight_arrival_time”的列,并且 User 模型将有一个名为 @user.flight_arrival_time 的属性。

目前的行动方案可能有哪些替代方案?有没有更有效的方法来存储这些值?

以下是一些限制:

我们有成千上万的用户(有人告诉我,将这些属性存储在不同的表中并加入它们会大大降低系统速度。我们通常有大约 20 名左右的管理员查询、导入、更新,并且通常使用滚出我们的系统,它在负载下已经很慢了。我没有权力说“买更多 {X} 这样我们可以更快。)。 我假设一个连接表(称为 user_attributes 之类的东西)将存储 user_id、属性名称和属性值。如果每个用户有额外的 15 个属性,我们有 100,000 个用户,会慢多少?

存储必须易于查询(我们使用动态搜索,允许用户从 User 模型中选择任何列作为搜索字段并找到输入的值)。 您是否可以选择允许简单查询(例如,查找属性名为“航班到达时间”为明天的所有用户)。这也会变得很慢吗?

我将进行一些实验,生成一些建议的架构,为每个用户生成 100,000 个用户和 20 个属性,并运行一些测试查询来检查执行时间,但我想了解从哪里开始。

感谢您的意见。

【问题讨论】:

标签: mysql ruby-on-rails schema


【解决方案1】:

不完全是一个答案,但我认为这种应用程序将从document-oriented database / NOSQL system 中受益匪浅,例如mongoDB

此类系统在设计上是无模式的。

加上我的两分钱,让用户对模式进行动态更改似乎在 RDBMS 环境中是一个非常危险的选择。您最终可能会得到包含数千个大部分为空列的表,并且 rails 会实例化具有数千个方法的对象。 .. 当您删除一列时会发生什么?

【讨论】:

  • NOSQL 是其他开发人员建议我们是否/何时可以找到集成的时间。用户是值得信赖的(他们购买并许可软件来运行他们的活动,他们不会故意以恶意为由。虽然他们可能会不小心做某事,但多年来他们还没有这样做过)。当一个字段被删除时,它会保留为一列 - 我们不会删除该列。每个数据库支持一个事件,一般不涉及添加超过20个左右的属性。
【解决方案2】:

从长远来看,您所遵循的方法会使您的数据库变得非常慢。 您的数据库大小将随着根据用户行为添加列而增加,这将导致其他元组的空值。

最好使用面向文档的数据库。比如 mongodb、couchdb、cassandra 等。

【讨论】:

    【解决方案3】:

    有一个宝石。 https://github.com/Liooo/dynabute

    另外,这个问题是重复的

    Rails: dynamic columns/attributes on models?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 2017-02-20
      相关资源
      最近更新 更多