DB 構造をより柔軟なレイアウトに調整する予定です。各人について、クライアントごとに異なる一連の値が保存されます (つまり、クライアントのクライアント)。現在のデザインを次のように変更します (簡略化)。
T_PersonsData
==============
*#Person_Id Field_01 Field_02 Field_03 ... Field_N
-------------------------------------------------------------
01 'Bob' 'Simpson' '1980-03-02' ... NULL
02 'John' 'Smith' '1972-04-10' ... NULL
03 'Sanders' 'Michael' 'Chicago' ... NULL
04 'Andrews' '1978-10-02' NULL ... NULL
T_PersonData_Definitions
=========================
*#Client_Id *Field Name #Type_Id
-------------------------------------------------
101 01 'First name' 1 (String)
101 02 'Last name' 1 (String)
101 03 'Date of birth' 3 (DateTime)
... ... ... ...
203 N 'Address' 1 (String)
(* = Primary key)
(# = Foreign key)
このようなものに:
T_PersonsData_New
=================
*#Person_Id *#Field_Id Value
--------------------------------------
01 01 'Bob'
01 02 'Simpson'
01 03 '1980-03-02'
... ... ...
T_PersonsData_Definitions_New
=============================
*Field_Id #Client_Id Name #Type
-----------------------------------------------
01 101 'First Name' 1
02 101 'Last Name' 1
03 101 'Date of Birth' 3
... ... ... ...
明らかな利点は次のとおりです。
- スケーラビリティ/柔軟性 (さまざまな量のフィールド タイプを使用できます)
- 不要な NULL エントリの防止
- など ...
ただし、たとえば、次のような単純な人物検索です。
SELECT Person_Id
FROM T_Persons_Data
WHERE Field_01 = 'Bob'
AND FIeld_02 LIKE 'S%'
AND ...
...複数の検索オプションを WHERE 句として追加できる場合、次のようになります。
SELECT DISTINCT Person_Id
FROM T_PersonsData_New
WHERE (SELECT Value
FROM T_PersonsData_New
WHERE Field_Id = 01
AND Person_Id = Person_Id) = 'Bob'
AND (SELECT Value
FROM T_PersonsData_New
WHERE Field_Id = 02
AND Person_Id = Person_Id) LIKE 'S%'
AND ...
...新しいデザインで。
もちろん、そのような検索を実装するためのよりエレガントな方法についての提案に感謝します。このようにDB設計を変更することをお勧めしますか?
さらに、両方の設計を比較する (簡単な!) パフォーマンス テストを実装したいと考えています。あなたは何を提案しますか、それはどのように見えるでしょうか? 最もパフォーマンスが重要なシナリオはどれですか?
前もって感謝します!