SQL Server 전체 텍스트 인덱스를 확장하여 외래 키 검색


2

SQL Server 전체 텍스트 인덱스는 둘 이상의 테이블을 인덱싱 할 수 없다는 것을 알고 있습니다. 그러나 필자는 테이블에 전체 텍스트 인덱스를 구현하고자하는 관계를 가지고 있습니다.

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) 

속성과 AttributeTypes 테이블은 응용 프로그램이 건설되고 전체에서 목록 아래로 드롭에 사용할 수있는 값을 유지 ... 다음의 3 개 가지 테이블을 가져 가라. 예를 들어 속성 ​​유형이 '검정색', '파랑', '빨강'등의 속성을 갖는 '차량 색상'입니다 ...

좋아, 문제는 사용자가 '파란색 포드 머스탱 ". 그렇다면 차량과 같은 테이블을 고려할 때 가장 좋은 솔루션은 무엇일까요?

"Vehicle"테이블에 "FK Atr VehicleColor"외에도 드롭 다운에서 선택된 텍스트 값을 보유하는 "Veh Color"라는 또 다른 필드를 생성합니까?

또는 "FK Atr VehicleColor"를 모두 삭제하고 "Veh Color"를 추가합니까? 드롭 다운이 업데이트 양식으로 채워지는 경우 "Vehicle Color"텍스트 값을 사용하여 "Atr Name"과 일치시킬 수 있습니다. 이 방법을 사용하면 데이터베이스에서 특성이 삭제 된 경우 처리해야합니다.

- 참고 : 두 밑줄 사이의 모든 문자는 이탤릭체이므로 코드보기 외부에서는 밑줄을 사용할 수 없습니다.

2

전체 텍스트 인덱싱을 위해 별도의 비정규 화 테이블을 사용하는 것이 일반적이라고 생각합니다. 이 테이블은 트리거 또는 SQL Server의 예약 된 작업에 의해 업데이트됩니다.

이것은 SQL Server 2000입니다. SQL Server에서는 indexed view (전체 텍스트 인덱스 : http://msdn.microsoft.com/en-us/library/ms187317.aspx)을 사용할 수 있습니다. 그러나 인덱싱 된 뷰에는 많은 제한이 있습니다. 예를 들어, 은 OUTER 조인을 사용하는 뷰를 인덱싱 할 수 없습니다..


0

SQL Server 2005에서는 전체 텍스트 인덱싱을 많이 사용하지는 않지만 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'을 포함하여이보기에서 전체 텍스트 색인을 만들 수 있습니다.


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