昨天,我问
this question
关于简单信息检索系统的最佳实践,我正在着手研究。
今天,我的客户问我是否可以允许他们在以后使用管理界面向主实体添加字段。也就是说,应用程序允许您在一个数据库表(我们称之为实体)中进行搜索,该表可能与其他对象有各种关联,但重点是实体。
我对这个问题的最初想法是创建两个新表:
(字段ID)
主键
、字段名、IsShownSearchResults和其他元数据)
这是将由管理界面创建其行的表。例如,如果客户后来决定添加跟踪(例如)实体的眼睛颜色的功能,他们将创建一个字段名为“眼睛颜色”的附加字段。
附加字段数据
(FieldDataID)
主键
,EntityID
FK
FK
,FieldValue)这是将实体与客户添加的任何其他字段的各自值关联起来的表。例如,以眼睛颜色为例,如果在添加字段时有两个实体(EntityID 3和4),并且新的AdditionalField的FieldID为1,则没有与实体关联的眼睛颜色数据是有效的。然后,客户可以选择将眼睛颜色“蓝色”添加到实体3中,我们将向AdditionalFieldData插入一行,如下所示:(
自动生成PK
,3,1,“蓝色”)。
因为我想在这些字段中轻松搜索,所以我只需要所有附加字段都有字符串值。
按照我在上一个问题中发布的方法,当用户执行搜索时,我将使用Linq To SQL和类似于以下的查询进行信息检索(当然,过滤逻辑在实践中会更复杂):
var results = from s in db.Stuff
where (s.Name.Contains(textFilter) ||
s.Title.Contains(textFilter))
select s;
我将修改查询,使其如下所示:
var results = from s in db.Stuff
where (...existing filter logic...) ||
s.AdditionalFieldData.Any(afd => afd.FieldName.Contains(textFilter))
select s;
所以我的问题是:这合理吗?有没有我错过的更好的解决方案?我是否应该知道这种方法有什么影响?
(请原谅我的愚蠢,对我来说太早了:)