【问题标题】:Names for database tables like t1,t2,t3 etc数据库表的名称,如 t1、t2、t3 等
【发布时间】: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


【解决方案1】:

您的问题的解决方案是使用命名空间。这就是命名空间的用途。在数据库领域,命名空间称为schema。 MySQL 决定变得怪异并将其架构称为“数据库”

普通数据库服务器:

Database Cluster
   Databases
     Schemas
       Tables, etc

MySQL 数据库服务器:

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

强制 developerX 使用 developerX 架构。如果他做表kittens,那肯定叫developerX.kittens

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

无论如何,如果您不想这样做,请为您的开发公司提供一个简短的代码前缀,例如“Company 12”的“x3”,并强制他们使用其前缀代码作为表名的前缀,例如x3_kittens。这不亚于模式,而且是hackish。

【讨论】:

  • 我理解你的意思吗 - 你建议有多个模式/数据库?是架构=数据库吗?
  • 一个数据库,数据库中有多个模式。您使用的是哪个数据库?
  • 我用mysql。你可以解释吗?我一直认为数据库-> 表。但据我了解,您建议数据库-> 架构-> 表?
  • 一个 mysql 数据库服务器只承载一个 real 数据库。这个数据库有很多模式。但是 mysql 是混蛋,并将模式称为“数据库”。如果您查看 postgres,您会看到具有多个架构的多个数据库。
  • “正常”是指“除 MySQL 之外的所有人”
猜你喜欢
  • 2020-01-09
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 2016-12-19
  • 2020-01-21
相关资源
最近更新 更多