1

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

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

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

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

以下是一些限制:

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

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

我将进行一些实验,生成一些建议的模式,为每个用户生成 100,000 个用户和 20 个属性,并运行一些测试查询来检查执行时间,但我想输入一些关于从哪里开始的信息。

感谢您的输入。

4

3 回答 3

2

不完全是一个答案,但我认为这种应用程序将从像mongoDB这样的面向文档的数据库/NOSQL 系统中受益匪浅。

这样的系统在设计上是无模式的。

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

于 2013-02-06T19:29:16.980 回答
1

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

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

于 2013-02-08T12:09:57.703 回答
0

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

另外,这个问题是重复的

Rails:模型上的动态列/属性?

于 2017-08-24T08:43:17.077 回答