【发布时间】:2012-01-10 12:53:00
【问题描述】:
我必须选择将存储内容类型(例如博客文章、页面、文档、发票、估算等)的数据库结构与动态字段:例如,Estimate 内容类型应该具有title、date 和 total price 字段。
但是,这些字段可以添加或删除,因此 1 年后 Estimate 常量类型可以具有 notes 字段。
这是著名的 CMS(例如 drupal)提供的一项常见任务,但我想知道获得最佳性能和灵活性的最佳方法是什么:例如 Drupal 使用一个带有 basic 字段的表(例如 @987654329 @),所有辅助字段都存储在动态创建的子表中,并通过外键链接到主表:
table node
| id | title | ...
| 1 | First example |
table fields_node_total_price
| id | node_id | value |
| 1 | 1 | 123.45 |
table fields_node_date
| id | node_id | value |
| 1 | 1 | 12345677 |
等等。
我的观点是这种方法非常灵活但容易陷入性能问题:为了获取文档的所有字段,您必须多次连接表,并且代码本身必须迭代多次才能构建查询(但这应该不是问题)。
顺便说一句,多表是最常用的方法。所以肯定有很多缺点。
我正在考虑使用单个表会有哪些缺点:
| id | title | total_price | date | ec...
我用 5 个和 50 个附加字段做了一些测试;单表方法和多表方法之间的性能是巨大的:单表大约快 50 倍。
每增加一个字段,就会在表中增加一列..这种做法会引发什么样的问题?
编辑
让我提供一些细节:
- 该应用程序仍处于设计阶段,是对字段编号为静态的旧应用程序的完全重新设计
- 我们做了一些测试来模拟要存储的对象,包括单表方法和多表方法(使用 50 个字段),结果是:
以秒为单位的时间:
Test 1° 2° 3° 4° 5° avg
1000 insert single_table 8,5687 8,6832 8,7143 8,7977 8,6906 8,69090137389466
1000 select single table LIKE '%key%' on char(250) field 1,5539 1,5540 1,5591 1,5602 1,5564 1,556705142
1000 select single table LIKE '%key%' on char(25) field 0,8848 0,8923 0,8894 0,8919 0,8888 0,889427996
1000 select single table id = $n 0,2645 0,2620 0,2645 0,2632 0,2636 0,263564462
1000 select single table integer field < $j 0,8627 0,8759 0,8673 0,8713 0,8767 0,870787334
1000 insert multi_table 446,3830 445,2843 440,8151 436,6051 446,0302 443,023531816
1000 select multi table LIKE '%key%' on char(250) field 1,7048 1,6822 1,6817 1,7041 1,6840 1,691367196
1000 select multi table LIKE '%key%' on char(25) field 0,9391 0,9365 0,9382 0,9431 0,9408 0,939536426
1000 select multi table id = $n 0,9336 0,9287 0,9349 0,9331 0,9428 0,93460784
1000 select multi table integer field < $j 2,3366 2,3260 2,3134 2,3342 2,3228 2,326600456
【问题讨论】:
-
“你必须多次查询数据库”——嗯,不。您将构建一个连接到要从中检索数据的每个表的查询。 “代码本身必须迭代很多次”——再说一次,不,除非你在做一些奇怪的事情。
-
@Damien_The_Unbeliever 你是对的;对于
query the db many times,我的意思是即使构造带有许多连接的查询,这通常会导致性能下降 -
也许这个问题更适合dba.stackexchange.com ?
标签: design-patterns database-design database-schema