0

次のデータベース テーブルと、そのデータを表すビューがあります。テーブルは階層型です(それがあなたの記述方法である場合):-

編集: 3 つのテーブルを偽のテーブル名/データ (この投稿用) に置き換えました。これは、プロジェクトなどについて何も投稿しないように NDA の下にあるためです。 :)

ファーストネーム

FirstNameId INT PK NOT NULL IDENTITY
Name VARCHAR(100)

ミドル・ネーム

MiddleNameId INT PK NOT NULL IDENTITY
Name VARCHAR(100) NOT NULL
FirstNameId INT FK NOT NULL

SurnameId INT PK NOT NULL IDENTITY
Name VARCHAR(100) NOT NULL
FirstNameId INT FK NOT NULL

したがって、firstname は親テーブルで、他の 2 つのテーブルは子です。

ビューは次のように見えます...

人名

FirstNameId
FirstName
MiddleNameId
MiddleName
SurnameId
Surname

ここにいくつかのサンプルデータがあります。

FNID FN   MNID    MN     SNID  SN
-----------------------------------
  1  Joe    1   BlahBlah   1  Blogs
  2  Jane   -    -         1  Blogs
  3  Jon    -    -         2  Skeet

ここで問題です。ビューで名前を効率的に検索するにはどうすればよいですか? 全文検索/カタログを使用する予定でしたが、それをビューに配置できません (または、少なくともビューに対して GUI を使用して機能させることはできません)。

編集 #2: 検索クエリの例をいくつか示します:-

exec uspSearchForPeople 'joe blogs'  (1 result)
exec uspSearchForPeople 'joe'        (1 result)
exec uspSearchForPeople 'blogs'      (2 results)
exec uspSearchForPeople 'jon skeet'  (1 result)
exec uspSearchForPeople 'skeet'      (1 result)

フルネームで新しいテーブルを生成する必要がありますか? それはどのように見えるでしょうか?

助けてください!

4

4 に答える 4

0

あなたが望んでいるのはIndex tableだと思います。インデックスが作成されるデータベースにデータが挿入されるため、それらのテーブルにいくつのテーブルと列があるかは問題ではありません。元。

あなたの名前に 1 つのテーブルをお勧めします。

NameTable
----------
Id
FirstName
MiddleName
LastName

必要な数の通常のテーブルを持つことができます...

IndexTable
----------
Id
Text 

テキストを主キーとして使用できますが、私は常に主キー用に別の id 列を持っています (ただの習慣です)。

IndexItemTable
----------
Id
IndexId // Has a foreign key reference to IndexTable Id
ReferenceId // The record Id of where the text occures
ReferenceTable // The table where the  text occures

次に、「Jim Barbarovich Fleming」という名前を挿入すると、インデックスもスキャンして空であることを確認し、Jim、Barbarovic、および Fleming の 3 つの新しいレコードを作成します。これらはすべて同じ referenceId を持ち、ReferenceTable は「NameTable」になります。 "Jim Bradley Fleming" のような別のレコードを挿入すると、インデックス テーブルをスキャンして "Jim" と "Fleming" の値が既にあることがわかります。そのため、referenceId が 2 で ReferenceTable が "NameTable" の IndexItem を作成します。

構築してインデックスを作成することで、単一のテキスト ボックスを介して検索し、それらの値を持つデータベース内のすべてのレコード/フィールドを見つけることができます。

注:インデックスに挿入して大文字または小文字に変更し、equals(value, OrdinalIgnoreCase) を使用する場合は、すべてを変更する必要があります。

編集: 画像をアップロードすることはできません。どこかにホストする必要があると思いますが、上記の表の図と何ら変わりはありません。IndexTable が持つ唯一の関係は、IndexItemTable との関係です。残りはコードで行います。元。

Name テーブルの新しいレコードの挿入または更新中に、次のことを行う必要があります。

  1. IndexTable をスキャンして、NameTable の各フィールドが存在するかどうかを確認します。

  2. そうでない場合は、見つからなかったテキストを含む新しいレコードを Index テーブルに追加します。その場合は、手順 3 に進みます。

  3. referenceId (NameTable 内のレコードの ID) と ReferenceTable (NameTable) を使用して IndexItemTable にレコードを追加し、次に IndexTable で見つかったテキストの IndexId を追加します。

次に、単一のテキスト ボックスを介して検索を行うときに、インデックス テーブル内の各単語を検索し、IndexTable で参照されている NameTable から名前を返します。

于 2009-11-19T17:19:12.203 に答える
0

名前型列 (first、middle、last) を持つテーブルが 1 つだけあり、それ自体に FK があり、名前列にクラスター化インデックスがあります。

   CREATE TABLE [Name] (
        NameID INT NOT NULL IDENTITY,
        [Name] varchar(100) not null,
        NameType varchar(1) not null,
        FirstNameID int null,
    )

    ALTER TABLE [Name] ADD CONSTRAINT PK_Name  PRIMARY KEY NONCLUSTERED (NameID)
    ALTER TABLE [Name] ADD CONSTRAINT FK_Name_FirstNameID FOREIGN KEY (FirstNameID) REFERENCES [Name](NameID)
    CREATE CLUSTERED INDEX IC_Name ON [Name] ([Name], NameType)

    DECLARE @fid int
    INSERT [Name] ([Name], NameType, FirstNameID) VALUES ('Joe', 'F', NULL)
    SELECT @fid = scope_identity()
    INSERT [Name] ([Name], NameType, FirstNameID) VALUES ('BlahBlah', 'M', @fid)
    INSERT [Name] ([Name], NameType, FirstNameID) VALUES ('Blogs', 'L', @fid)

    INSERT [Name] ([Name], NameType, FirstNameID) VALUES ('Jane', 'F', NULL)
    SELECT @fid = scope_identity()
    INSERT [Name] ([Name], NameType, FirstNameID) VALUES ('Blogs', 'L', @fid)

    INSERT [Name] ([Name], NameType, FirstNameID) VALUES ('Jon', 'F', NULL)
    SELECT @fid = scope_identity()
    INSERT [Name] ([Name], NameType, FirstNameID) VALUES ('Skeet', 'L', @fid)

次に、ストアド プロシージャで sp_executsql、linq to sql、または醜い文字列を使用して、検索する値の数に基づいて動的だがパラメーター化された WHERE 句を作成できます (または、最大で 3 つしかないことを前提としてハードコーディングします)。コードでの操作。

于 2009-05-28T01:55:16.607 に答える