Database design 测试表性能规范化与非规范化

Database design 测试表性能规范化与非规范化,database-design,normalization,performance-testing,denormalization,database-normalization,Database Design,Normalization,Performance Testing,Denormalization,Database Normalization,我们计划将您的数据库结构调整为更灵活的布局。对于每个人,都会存储一组不同的值,这些值因客户而异(也就是说,我们客户的客户)。我们希望更改当前的设计,如下所示(简化): 对这样的事情: T_PersonsData_New ================= *#Person_Id *#Field_Id Value -------------------------------------- 01 01 'Bob' 01 02

我们计划将您的数据库结构调整为更灵活的布局。对于每个人,都会存储一组不同的值,这些值因客户而异(也就是说,我们客户的客户)。我们希望更改当前的设计,如下所示(简化):

对这样的事情:

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
...         ...            ...              ...
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 ...
明显的优点是:

  • 可伸缩性/灵活性(可以使用不同数量的字段类型)
  • 防止不必要的空条目
  • 等等
但是,例如,一个简单的person搜索,如:

SELECT Person_Id
  FROM T_Persons_Data
 WHERE Field_01 = 'Bob'
   AND FIeld_02 LIKE 'S%'
   AND ...
…如果可以添加多个搜索选项作为where子句,则如下所示:

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
...         ...            ...              ...
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设计

此外,我想实现一个(简单的!)性能测试来比较这两种设计。你有什么建议,那会是什么样子?哪些场景对性能最为关键


提前谢谢

在实施计划之前,要认真思考,认真测试。您的内容从幻灯片16开始。@MikeSherrill'Catcall'谢谢您的链接!由于这个新设计还没有实现,我将决定是否应该(根据测试),这非常有帮助。这是一个你会后悔的决定。这个老问题再次出现:@sqlvogel再次感谢有用的链接!对此我想得越多(&读得越多),我就越能理解为什么这是一个坏主意,而且我感到欣慰的是,这一改变最初不是我的想法^^^我将推广一种不同的解决方案。