2010-05-12 84 views
2

我有一个Lexicon模型,我希望用户能够为每个词典创建动态特征。动态搜索字段,最佳实践?

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

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

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

但假设我有1,000,000,000个词典,并且如果为每个词典创建一个动态特征,则这将导致在DynamicField模型中创建1,000,000,000行。

因此,SQL搜索功能会变得相当低效,而很多动态功能创建。

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

我应该采取哪种方式?

  1. 寻找一个更好的数据库设计,动态字段

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

+0

1.你的数据库表(或Rails模型)现在看起来如何?也许代码快照? 2.你想支持哪种查询? (等于,在,不在,像,大于等) – 2010-05-12 09:11:56

+0

你可能想要的设计模式是:http://en.wikipedia.org/wiki/Entity-attribute-value_model – DJTripleThreat 2010-05-12 12:20:23

+0

普通的,类型我想实现的搜索类似于LIKE,不到,大于,大于,等于,不在 – boblu 2010-05-12 14:20:16

回答

2

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

+0

我现在在看mongodb。我会发布更新,如果我找到一个体面的解决方案。 感谢relpy – boblu 2010-05-12 14:20:52

+0

酷,我过去曾经使用过Solr,但是它很难安装,尤其是在Linux机器上,所以我认为MongoDB应该是非常友好的。 – DJTripleThreat 2010-05-12 20:33:09

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文件中以获得创意。)

+0

谢谢您对EAV设计模式的解释。 我刚刚读了你给我关于这个主题的那个wiki页,并且对它有一点点想法。 我想问的是如何在传统数据库(关系数据库)中实现EAV设计模式? 或者我认为mongodb本身已经在内部实现了EAV设计模式,我就在这里吗? – boblu 2010-05-13 02:35:58

+0

使用此示例作为在关系数据库中执行此操作的一种方式,但使用MongoDB将XML(动态数据定义的完美示例)发布到MongoDB。如果MongoDB与Solr或Thinking Sphinx类似,您将能够对其进行非常复杂的搜索。例如,如果您有产品数据库,但产品具有不同的属性(书籍有页面,笔记本电脑有电池寿命等),则可以使用特殊的查询语言返回所需的结果。这是软管Solr的一个例子:http://lucene.apache.org/solr/tutorial.html – DJTripleThreat 2010-05-13 04:00:55