Расширение полнотекстового индекса SQL Server для поиска по внешним ключам - PullRequest
2 голосов
/ 24 сентября 2008

Я знаю, что полнотекстовый индекс 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 содержат значения, которые можно использовать в раскрывающихся списках во всем создаваемом приложении. Например, Тип атрибута «Цвет транспортного средства» с атрибутами «Черный», «Синий», «Красный» и т. Д.

Хорошо, проблема возникает, когда пользователь пытается найти «Синий Ford Mustang». Так что же является лучшим решением, учитывая, что таблицы, такие как Vehicle, станут довольно большими?

Создать ли в таблице «Автомобиль» еще одно поле «Veh Color», которое содержит текстовое значение того, что выбрано в раскрывающемся списке, в дополнение к «FK Atr VehicleColor»?

Или я вообще исключаю "FK Atr VehicleColor" и добавляю "Veh Color"? Я могу использовать текстовое значение «Veh Color» для сопоставления с «Atr Name», когда выпадающий список заполнен в форме обновления. При таком подходе мне придется справиться, если атрибуты будут удалены из базы данных.

- Примечание. Невозможно использовать подчеркивание вне представления кода, поскольку все между двумя подчеркиваниями выделено курсивом .

Ответы [ 3 ]

2 голосов
/ 24 сентября 2008

Я считаю, что обычной практикой является создание отдельной денормализованной таблицы специально для полнотекстовой индексации. Затем эта таблица обновляется с помощью триггеров или, как это было в нашем случае, с помощью запланированной задачи SQL Server.

Это был SQL Server 2000. В SQL Server вы можете иметь индексированное представление с полнотекстовым индексом: http://msdn.microsoft.com/en-us/library/ms187317.aspx. Но обратите внимание, что существует много ограничений для индексированных представлений; например, вы не можете индексировать представление, которое использует OUTER join .

2 голосов
/ 24 сентября 2008

Вы можете создать представление, которое извлекает все необходимые данные, а затем применить к представлению полнотекстовый индекс. Представление должно быть создано с опцией 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
0 голосов
/ 24 сентября 2008

Насколько я понимаю (я много использовал 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» в индексе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...