我们计划将您的数据库结构调整为更灵活的布局。对于每个人,都会存储一组值,这些值因客户而异(即我们客户的客户)。我们想要改变看起来像这样(简化)的当前设计:
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 条目
- ETC。 ...
但是,例如一个简单的人员搜索,例如:
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 ...
...在新设计中。
当然,如果有任何建议可以更优雅地实现这种搜索,我将不胜感激。您会建议像这样更改数据库设计吗?
此外,我想实施一个(简单的!)性能测试来比较两种设计。你会建议什么,这怎么可能?哪些场景对性能最关键?
提前致谢!