我们有以下情况 - 我们有不同开发人员可以工作的框架,以及不了解其他开发人员的框架。我们有一个客户可以从不同的开发人员那里获取扩展(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
。跨数据库的所有引用都是唯一的,我们不会超过最大的表名和列名限制。
问题 - 您如何看待,是好的还是坏的解决方案以及此类问题的其他解决方案是什么?
答案 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。