动态可搜索领域,最佳实践?

时间:2010-05-12 09:02:22

标签: mysql ruby-on-rails ruby

我有一个Lexicon模型,我希望用户能够为每个词典创建动态功能。

我有一个复杂的搜索界面,让用户搜索属于Lexicon模型的每个特征(包括动态的)。

如果不是用于搜索,我可以使用序列化文本字段来保存所有动态信息。

如果我想让用户搜索所有字段,我创建了一个DynamicField模型来保存所有动态创建的功能。

但是想象一下我有1000,000,000个词典,如果为每个词典创建一个动态功能,这将导致在DynamicField模型中创建1,000,000,000行。

因此,在创建大量动态特性的同时,sql搜索功能将变得非常低效。

这种情况有更好的解决方案吗?

我应该采取哪种方式?

  1. 为动态字段搜索更好的数据库设计

  2. 尝试使用当前的数据库设计调整mysql(添加缓存字段,添加索引...)

2 个答案:

答案 0 :(得分:2)

另一个想法可能是使用MongoDBMongoMapperThinking SphinxSolr。以下是关于如何使用Mongo的Railscast:http://railscasts.com/episodes/194-mongodb-and-mongomapper

答案 1 :(得分:1)

我认为最好的方法是使用名称/值配对而不是动态字段。让我解释一下使用EAV design pattern

所以不要有这样的东西:

Table: MedicalRecords
<table>
  <tr>
    <th>Temperature in degrees Fahrenheit</th>
    <th>Presence of Cough</th>
    <th>Type of Cough</th>
    <th>Heart Rate in beats per minute</th>
    <th>Column X</th>
    <th>Column X + 1</th>
    <th>... Column N</th>
  </tr>
  <tr>
    <td>102</td>
    <td>True</td>
    <td>With phlegm, yellowish, streaks of blood</td>
    <td>98</td>
    <td>????</td>
    <td>????</td>
    <td>????</td>
  </tr>
</table>

你可以这样设计你的表:

Table: MedicalRecords
<table>
  <tr>
    <th>Name</th>
    <th>Value</th>
  </tr>
  <tr>
    <td>Temperature in degrees Fahrenheit</td>
    <td>102</td>
  </tr>
  <tr>
    <td>Presence of Cough</td>
    <td>True</td>
  </tr>
  <tr>
    <td>Type of Cough</td>
    <td>With phlegm, yellowish, streaks of blood</td>
  </tr>
  <tr>
    <td>Heart Rate in beats per minute</td>
    <td>98</td>
  </tr>
  <tr>
    <td>Column X</td>
    <td>????</td>
  </tr>
  <tr>
    <td>Column X + 1</td>
    <td>????</td>
  </tr>
  <tr>
    <td>... Column N</td>
    <td>????</td>
  </tr>
</table>

(试图让表标签工作,但无法尝试将我的代码复制到html文件中以获得想法。)