Расширение полнотекстового индекса SQL Server для поиска по внешним ключам

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 958
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Другие вопросы по теме