1

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設計を変更することをお勧めしますか?

さらに、両方の設計を比較する (簡単な!) パフォーマンス テストを実装したいと考えています。あなたは何を提案しますか、それはどのように見えるでしょうか? 最もパフォーマンスが重要なシナリオはどれですか?

前もって感謝します!

4

0 に答える 0