模糊文本搜索与连接

时间:2010-10-22 23:29:46

标签: php sql database-design

我被指派建立一个问题&为我的公司回答小部件。公司中的许多不同部门都希望在各种网站上使用此小部件,他们希望根据特定和唯一标准过滤问题。

这里的战斗是可扩展性与效率。

我应该:

A)根据每个标准在数据库中制作唯一的映射表?例如:

table questions (q_id,q_question,q_details,q_poster...)
table questions_criteria_a (q_id,criteria_a.id)
table questions_criteria_b (q_id,criteria_b.id)
table questions_criteria_c (q_id,criteria_c.id)

这将允许我SELECT * FROM问题q LEFT JOIN questions_criteria_a qca ON q.q_id = qca.q_id LEFT JOIN .... etc ...

我的问题是,我不知道每个部门实际上或将来可能需要的标准是什么 - 这意味着每次提出新标准时我都需要添加一个新表。标准的示例可以是州,城市,主题,供应商密钥等。他们希望显示与供应商有关的所有问题,并且例如与加利福尼亚州圣何塞有关。每个查询都需要任何,全部或不需要任何标准 - 部门可以编写自己的数据获取逻辑。

B)让每个部门提供标准逻辑标准,该标准将作为json字符串或序列化数据存储在问题表中。例如:

table questions (q_id,question,q_details,q_poster,q_criteria...)
-- the criteria would look like {'state':'CA','city':'San Jose','vendor_key':'13144'}

因此,(B)的明显优势是数据存储逻辑可扩展且一致 - (A)的明显优势是查询将比从q_criteria LIKE“%”的问题执行SELECT *快得多city':'San Jose'%“和q_criteria LIKE”%'state':'CA'%“etc .....

想法?思考?反馈?

如果你有一个上面没有提到的更好的解决方案,我很乐意考虑它。

2 个答案:

答案 0 :(得分:2)

我定义了三个表 -

问题

  • question_id(pk,auto_increment)

准则

  • criteria_id(pk,auto_increment)
  • criteria_description

QUESTIONS_CRITERIA

  • question_id(pk,QUESTIONS.question_id的外键)
  • criteria_id(pk,CRITERIA.criteria_id的外键)

较少的JOIN,并且能够无限地保持标准关联。如有必要,可以对标准进行细分。

答案 1 :(得分:1)

我认为您可能正在寻找一些多对多关系,以便您可以从它们所属的条件中抽象出数据类型,而无需创建所有额外的表。

类似于'criteria_to_question'表,您可以将多个条件映射到问题,这样可以保持数据库清洁和可扩展。