Я знаю, что полнотекстовый индекс 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», когда раскрывающийся список заполняется в форме обновления. При таком подходе мне придется обрабатывать, если атрибуты удаляются из базы данных.
- Примечание: нельзя использовать подчеркивание вне представления кода, так как все между двумя подчеркиваниями - выделенный курсивом.





Насколько я понимаю (я много использовал 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 в индексе.
Я считаю, что это обычная практика - иметь отдельную денормализованную таблицу специально для полнотекстового индексирования. Затем эта таблица обновляется триггерами или, как в нашем случае, запланированной задачей SQL Server.
Это был SQL Server 2000. В SQL Server вы можете иметь индексированный просмотр с полнотекстовым индексом: http://msdn.microsoft.com/en-us/library/ms187317.aspx. Но обратите внимание, что существует множество ограничений на индексированные представления; например, вы не можете проиндексировать представление, которое использует ВНЕШНЕЕ соединение.
Вы можете создать представление, которое извлекает любые нужные вам данные, а затем применить к представлению полнотекстовый индекс. Представление должно быть создано с опцией 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