【发布时间】:2015-07-15 11:18:52
【问题描述】:
我们有以下情况 - 我们有不同的开发人员可以使用的框架,而他们不了解其他开发人员。我们有一个客户可以从不同的开发人员那里获取扩展(ebj osgi 包和 sql 脚本)并将它们添加到一个数据库中。
因此,由于开发人员不同,因此可能会出现名称冲突(表、索引、外键)。我们想实现类似 java 的名称 - 例如:comOrganizationFooTable 但是表名和列的最大长度为 30 个字符。此外,它是 CRUD 应用程序,并且有大量来自不同开发人员的表连接。最后 - 我们使用带有 xml 映射器的 mybatis。
考虑到这一切,我想到了以下解决方案。客户通过读取所有长数据库名称的特殊程序将新表添加到数据库,将它们替换为 tN,创建表 tN,tM... 并在特殊表中保存链接(t2 -> 表原始名称)。之后,当 ejb osgi bundle 启动时,程序将 xml mapper 中的原始名称替换为 tX,并将更新后的 xml mapper 加载到 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。跨数据库的所有引用都是唯一的,我们不会超过最大表名和列名限制。
问题 - 你怎么看,这是好的还是坏的解决方案,以及此类问题的其他解决方案是什么?
【问题讨论】:
-
为什么不能为每个客户创建一个单独的数据库?
-
@Explosion Pills 因为即使是客户从 5 个开发人员那里获得扩展,他也会有 5 个 dabatase - 这是备份和设置 java-ee 服务器所必需的。除了这种情况,我们忘记了外键和数据完整性。
-
@Explosion Pills 此外 - 开发人员不了解客户。每个开发者只知道自己的扩展,不关心其他任何事情。
-
这听起来是个非常糟糕的主意 - 每个客户都应该拥有自己的数据库、自己的架构或两者的某种组合(理想)。根据您的描述,您既不能轻松地实施安全性(如果有的话),也不能维护它,而且正如您所暗示的那样,可能会导致表名冲突以及其他问题。
-
@Siyual 感谢您的评论。不过,我不明白你。我建议的只是一个数据库!但是这个单一的数据库有来自不同开发者的表。
标签: java sql database-design mybatis