0

我一直在研究我的数据库,我想到也许最好将我的两个表组合起来以更好地组织数据并可能获得性能优势(或没有?)。

我有两张表,其中包含地址、交货和另一张发票,它们的结构是相同的。一个表包含发票地址,另一个包含交货。

将这些合并到一个简单地称为“地址”的表中并创建一个名为 addressTypeId 的新列会有什么影响?这个新列引用了一个新表,其中包含地址类型,如送货、发票、家庭等。

让它们像现在这样,分开,性能更好,因为对不同类型地址(交货和发票)的请求使用两个表而不是一个表,这可能意味着请求地址数据时的延迟?

顺便说一句,我正在使用 INNODB。

4

4 回答 4

1

如果您缺少适当的索引,则查找性能将下降两倍(如果您正在合并两个大小相同的表)。但是,如果您缺少索引,您可能不会关心性能。使用散列索引的查找是恒定时间的。使用树索引查找是对数的,因此影响很小。对树索引的写入也是对数的,对哈希映射的写入也是摊销常数。

不要遭受过早的优化!!!

一个好的设计比峰值性能更重要。地址查找可能不是您的瓶颈。糟糕的数据库设计导致的糟糕代码远远超过任何好处。如果您制作两个表,您将重复代码。代码重复是维护的噩梦。

合并表。当您需要在不久的将来扩展您的应用程序时,您将不胜感激。您可能想要创建更多地址类型。您可能希望向地址添加通用功能(格式)。您的客户不会注意到遍历二叉树的另一层所带来的额外毫秒数。他们会注意到您很难添加额外的功能,并且他们会注意到代码重复引起的不一致。

您甚至可以通过合并表来获得性能。虽然您可能需要遍历树中的一个额外节点,但树可能更有可能缓存在内存中并且不需要磁盘访问。磁盘访问很昂贵。您可以通过合并来减少磁盘访问。

正如@BenP.P.Tung 已经说过的那样,您不需要额外的表来进行枚举。使用枚举类型。

于 2012-10-20T09:39:48.873 回答
0

如果只需要区分地址差异。我建议您需要的是此合并表中的 ENUM 列。如果存在,您可以添加一个新列,如下所示,

alter table add addressTypes ENUM('delivery','invoice','home') DEFAULT NULL;

或者当您无法获得所需信息时,您认为应该默认的默认发票。

不需要一次放置所有枚举值。正是您现在需要的,并在未来增加更多价值,如下所示。

alter table change addressTypes addressTypes ENUM('delivery','invoice','home','office') DEFAULT NULL;

于 2012-10-20T09:21:25.407 回答
0

一张桌子就可以了。如果存在性能问题,则将地址类型列添加到索引开头的主索引。在您拥有大量地址之前,这将避免任何性能问题。

于 2012-10-20T10:21:59.497 回答
0

它们的结构是相同的。

它们的约束也相同吗?1

  • 如果是,则合并地址。
  • 如果不是,请将它们分开。

约束与其字段一样是表的一部分。

让它们像现在这样,分开,性能更好,因为对不同类型地址(交货和发票)的请求使用两个表而不是一个表,这可能意味着请求地址数据时的延迟?

您是否以相同的方式查询这两种地址?

  • 如果是,则无论哪种方式都无关紧要(假设您正确索引)。
  • 如果不是,那么不同的表使您能够以不同的方式索引或聚集您的数据。

相关文章:


1例如,交货和发票都应该能够引用(通过外键)相同的地址吗?地址的 PK 是否应该对所有地址都是唯一的,还是仅对特定类型的地址是唯一的?是否存在针对一种地址类型而不是另一种地址类型的任何 CHECK?等等等等……

于 2012-10-20T17:44:52.820 回答