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

时间:2015-05-05 15:54:25

标签: java sql database-design mybatis

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

因为有不同的开发人员可能存在名称冲突(表,索引,外键)。我们希望像名称一样实现java - 例如:comOrganizationFooTable但是表名和列的最大长度是30个字符。除了它是CRUD应用程序,还有大量的表可以来自不同的开发人员。最后一个 - 我们使用mybatis和xml mappers。

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

最重要的是xml mapper的两个部分都存在长的唯一原始名称:mapper部分和sql代码部分。 当我们连接不同的表并希望使用来自不同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。跨数据库的所有引用都是唯一的,我们不会超过最大的表名和列名限制。

问题 - 您如何看待,是好的还是坏的解决方案以及此类问题的其他解决方案是什么?

1 个答案:

答案 0 :(得分:2)

您的问题的解决方案是使用命名空间。这就是命名空间的用途。在database-land中,名称空间称为模式。 MySQL决定很奇怪并称他们的模式'数据库'

普通数据库服务器:

Database Cluster
   Databases
     Schemas
       Tables, etc

MySQL数据库服务器:

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

强制developerX使用developerX架构。如果他创建了一个表kittens,则必须将其称为developerX.kittens

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

无论如何,如果您不想这样做,那么为您的开发公司提供一个简短的代码前缀,例如“公司12”的“x3”,并强制它们使用前缀代码为表名添加前缀,例如x3_kittens。这不仅仅是模式,而且是hackish。