【发布时间】: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 个属性,并运行一些测试查询来检查执行时间,但我想了解从哪里开始。
感谢您的意见。
【问题讨论】:
-
你有没有想过使用垂直桌子?查看amardaxini.github.com/2010/05/01/vertical-table-in-rails.html 如果您需要表单来灵活地满足业务需求,我真的没有其他方法可以走。
标签: mysql ruby-on-rails schema