数据库表的名称,如 t1、t2、t3 等

Names for database tables like t1,t2,t3 etc

我们有以下情况 - 我们有不同的开发人员可以使用的框架,但他们不了解其他开发人员。我们有一位客户可以从不同的开发人员那里获取扩展(ebj osgi 包和 sql 脚本)并将它们添加到一个数据库中。

因此,由于有不同的开发人员,因此可能会出现名称冲突(table、索引、外键)。我们想像名称一样实现 java - 例如:comOrganizationFooTable 但是 table 名称和列的最大长度为 30 个字符。此外,它是 CRUD 应用程序,还有大量来自不同开发人员的 tables 的连接。最后 - 我们将 mybatis 与 xml 映射器一起使用。

考虑到所有这些,我想到了以下解决方案。客户通过读取所有长数据库名称的特殊程序将新的 tables 添加到数据库,将它们替换为 tN,创建 tables tN,tM... 并在特殊的 tables 中保存链接(t2 -> table 原始名称)。之后,当 ejb osgi bundle 启动时,程序用 tX 替换 xml 映射器中的原始名称,并将这个更新的 xml 映射器加载到 mybatis 配置中。

最重要的是 xml 映射器的两个部分都存在长而独特的原始名称:映射器部分和 sql 代码部分。 当我们加入不同的 table 并希望使用来自不同 xml 映射器的映射器部分时,这一点非常重要。

示例:

<resultMap id="readItemsRM" type="com.mycompany.product.SomeDTO">
        <id property="id" column="%comMyCompanyProductSomeTable.id"/>
        <result property="name" column="%comMyCompanyProductSomeTable.name"/>
</resultMap>

 <sql id="mainSelect">
   SELECT 
     %comMyCompanyProductSomeTable.id,
     %comMyCompanyProductSomeTable.name
   FROM
     %comMyCompanyProductSomeTable
 </sql> 

因此,在动态更改之后,所有 %comMyCompanyProductSomeTable 都变为 t29

按照这个方法我们不需要使用任何 AS。跨数据库的所有引用都是唯一的,我们不会超过最大 table 和列名限制。

问题 - 你怎么看,这个解决方案是好是坏,还有什么其他解决方案?

您的问题的解决方案是使用 命名空间。这就是名称空间的用途。在数据库领域,名称空间称为 schema。 MySQL 决定变得怪异并称他们的模式为 'databases'

普通数据库服务器:

Database Cluster
   Databases
     Schemas
       Tables, etc

MySQL 数据库服务器:

Database Cluster
     Schemas (called 'databases')
       Tables, etc

强制 developerX 使用 developerX 架构。如果他做一个tablekittens,肯定叫developerX.kittens

是的,您可以在模式之间使用外键。在外键中使用完全限定名称:schema_name.table_name.

无论如何,如果你不想那样做,那就为你的开发公司想出一个简短的代码前缀,比如 "x3" 代表 "Company 12",并强制他们在前缀 table 名称及其前缀代码,例如 x3_kittens。这与模式一样工作,而且很老套。