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 ...
明显的优点是:
- 可伸缩性/灵活性(可以使用不同数量的字段类型)
- 防止不必要的空条目
- 等等
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再次感谢有用的链接!对此我想得越多(&读得越多),我就越能理解为什么这是一个坏主意,而且我感到欣慰的是,这一改变最初不是我的想法^^^我将推广一种不同的解决方案。