Mysql SQL一对一关系与扁平化

Mysql SQL一对一关系与扁平化,mysql,sql,Mysql,Sql,我使用的是一个标准的SQL数据库,我试图弄清楚是否要将表展平或使其更“面向对象”。对我来说,较小的表更容易阅读,但它需要连接表并具有一对一的关系。这通常是一种很好的做事方式,还是在SQL世界中不受欢迎 我有一个具有以下属性的表: MYTABLE - ID - NAME - LABEL - CREATED_TS - MODIFIED_TS - CREATED_USER - MODIFIED_USER 对我来说,创建/修改的字段将是它们自己的对象。实际上还有一些字段,所以它并不是这么小。我认为应该

我使用的是一个标准的SQL数据库,我试图弄清楚是否要将表展平或使其更“面向对象”。对我来说,较小的表更容易阅读,但它需要连接表并具有一对一的关系。这通常是一种很好的做事方式,还是在SQL世界中不受欢迎

我有一个具有以下属性的表:

MYTABLE
- ID
- NAME
- LABEL
- CREATED_TS
- MODIFIED_TS
- CREATED_USER
- MODIFIED_USER
对我来说,创建/修改的字段将是它们自己的对象。实际上还有一些字段,所以它并不是这么小。我认为应该创建另一个名为“MYTABLE_MODINFO”的表或类似的表,该表包含已创建和修改的字段,并且在需要来自这些字段的数据时将它们连接起来。这些表不是高访问性的表,它们每分钟不会有大量的查询,甚至不会有数百行,所以我认为效率不是什么大问题


所以我想知道的主要是,这是一个普遍接受的设计,还是你应该保持你的桌子结构平坦

避免数据库“一对一”,您将失去性能、可扩展性和独立性。你能想象如果你想每个ID存储2张图片会发生什么吗?您是创建另一个字段还是重复该行??。。。当您想要升级时,创建关系更容易,更自由,请查看本教程

除此之外,您还应该规范化DB,以确保一切尽可能处于最佳状态。请记住,最重要的是采取你需要的,并适应它


您应该在同一个表中创建审核信息。原因是该数据是行的一部分,是一对一的关系,因此没有必要将其分开

如果您想存储审计信息(审计跟踪/历史记录),那么您可以创建另一个表,但是在大多数情况下,我看到这是通过“复制”数据并创建代理键和映射回原始行来构建的。我之所以在引号中列出复制,是因为审计本质上需要对旧数据进行复制……如果数据在编写后是链接和可更改的,那么它就不是真正的审计


只要我的两分钱。如果没有意义,那么我可以提供一些例子。但是,要点是每一行只会有一条当前修改信息,所以如果它永远不会有多条修改信息,为什么要将其打破呢?

在我看来,RDBMS设计与面向对象方法不同。您提到的示例不是不同的对象域,而是记录的数据继承。由于不会有太多查询/执行表的开销,因此您应该将它们保留在同一个表中,以便进行审计,并且在规范化数据时更易于使用。

修改信息不是一个不同的“对象”-它本质上是主记录的一部分。为什么要将它们拆分?虽然,由于<代码> CREATEDIG.行将重复遍历,您可以考虑仅具有更新行-创建者是第一个修饰符(性能折衷,但是)。另外,不要在列名中使用数据类型后缀——这样做可能会伤到自己的脚。使用类似于
createdAt
createdBy
modifiedAt
modifiedBy
。当列的数量达到15+并且有明确的定位分组时,比如说“X,Y,width-height”。即使他们肯定仍然是一对一的关系,但把他们搬出去有意义吗?对我来说,当一个表变得如此之大时,尤其是当您试图查看网格中的数据时,这会让人感到恼火。列的数量“并不重要”(即使每个表有4096列),重要的是一个DB关系,具有适当的索引、PK和FK,如果您必须创建15个表,这没有问题,请确保创建正确的结构