数据库表的名称,如 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
。这与模式一样工作,而且很老套。
我们有以下情况 - 我们有不同的开发人员可以使用的框架,但他们不了解其他开发人员。我们有一位客户可以从不同的开发人员那里获取扩展(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
。这与模式一样工作,而且很老套。