3

我知道 SQL Server 全文索引不能索引多个表。但是,我想在表中实现全文索引的关系。

拿下面的3张桌子...

Vehicle
Veh_ID - int (Primary Key)
FK_Atr_VehicleColor - int
Veh_Make - nvarchar(20)
Veh_Model - nvarchar(50)
Veh_LicensePlate - nvarchar(10)

Attributes
Atr_ID - int (Primary Key)
FK_Aty_ID - int
Atr_Name - nvarchar(50)

AttributeTypes
Aty_ID - int (Primary key)
Aty_Name - nvarchar(50)

Attributes 和 AttributeTypes 表包含的值可以在整个正在构建的应用程序的下拉列表中使用。例如,属性类型为“车辆颜色”,属性为“黑色”、“蓝色”、“红色”等...

好的,所以当用户尝试搜索“Blue Ford Mustang”时问题就来了。那么考虑到像 Vehicle 这样的表会变得相当大,最好的解决方案是什么?

我是否在“车辆”表中创建另一个字段,即“车辆颜色”,除了“FK Atr VehicleColor”之外,它还保存下拉列表中选择的文本值?

或者,我是否完全放弃“FK Atr VehicleColor”并添加“Veh Color”?当下拉列表填充到更新表单中时,我可以使用“Veh Color”的文本值来匹配“Atr Name”。使用这种方法,如果从数据库中删除属性,我将不得不处理。

- 注意:不能在代码视图之外使用下划线,因为两个下划线之间的所有内容都是斜体

4

3 回答 3

4

我相信专门为全文索引创建单独的非规范化表是一种常见的做法。然后,该表由触发器更新,或者在我们的例子中,由 SQL Server 的计划任务更新。

这是 SQL Server 2000。在 SQL Server 中,您可以拥有一个带有全文索引的索引视图:http: //msdn.microsoft.com/en-us/library/ms187317.aspx。但请注意,索引视图有很多限制;例如,您不能索引使用 OUTER join 的视图

于 2008-09-23T20:56:42.273 回答
2

您可以创建一个视图来提取您需要的任何数据,然后将全文索引应用于视图。视图需要使用“WITH SCHEMABINDING”选项创建,并且需要有一个唯一索引。

CREATE VIEW VehicleSearch
WITH SCHEMABINDING
AS
SELECT
  v.Veh_ID,
  v.Veh_Make,
  v.Veh_Model,
  v.Veh_LicensePlate,
  a.Atr_Name as Veh_Color
FROM
  Vehicle v
INNER JOIN
  Attributes a on a.Atr_ID = v.FK_Atr_VehicleColor
GO

CREATE UNIQUE CLUSTERED INDEX IX_VehicleSearch_Veh_ID ON VehicleSearch (
  Veh_ID  ASC
) ON [PRIMARY]
GO

CREATE FULLTEXT INDEX ON VehicleSearch (
  Veh_Make  LANGUAGE [English],
  Veh_Model LANGUAGE [English],
  Veh_Color LANGUAGE [English]
)
KEY INDEX IX_VehicleSearch_Veh_ID  ON [YourFullTextCatalog]
WITH CHANGE_TRACKING AUTO
GO
于 2008-09-23T21:06:23.077 回答
0

据我了解(我经常使用 SQL Server,但从未使用全文索引)SQL Server 2005 允许您针对视图创建全文索引。所以你可以创建一个视图

SELECT 
  Vehicle.VehID, ..., Color.Atr_Name AS ColorName 
FROM
  Vehicle 
LEFT OUTER JOIN Attributes AS Color ON (Vehicle.FK_Atr_VehicleColor = Attributes.Atr_Id)

然后在此视图中创建全文索引,包括索引中的“ColorName”。

于 2008-09-23T20:55:53.007 回答