在数据库之间交叉是否可以接受?

时间:2008-11-18 15:17:35

标签: database database-design

我不确定这种做法实际上是什么,所以也许有人可以编辑标题以更准确地反映我的问题。

假设我们有一个存储不同类型对象的网站。每种类型的对象都有自己的数据库(书籍数据库和各种信息及其表格,CD数据库及其表格信息等)。但是,所有对象都有关键字,关键字应该在所有对象中保持一致,而不管类型如何。使用具有几个表的新数据库来存储关键字,但是每个对象数据库负责将对象ID映射到关键字。

这是一个好习惯吗?

8 个答案:

答案 0 :(得分:5)

是否有理由为每种类型的对象设置单独的数据库?最好使用多个表并加入它们。例如,您可能有一个表GENERIC_OBJECT,其中包含所有类型中常见的内容,然后是一个名为BOOK_OBJECT的表,其中BOOK_OBJECT.ID = GENERIC_OBJECT.ID表示给定的书。对于给定的CD,另一个表是CD_OBJECT,其中CD_OBJECT.ID = GENERIC_OBJECT.ID。然后,所有对象中常见的关键字之类的内容将存储在GENERIC_OBJECT表中,而特定于项目的内容将放在项目的相应表格中。

答案 1 :(得分:4)

通过将它们分成不同的数据库,您将失败:

  • 执行ACID事务的能力(假设您没有使用两阶段提交解决方案)。
  • 具有参照完整性的能力。
  • 跨表加入。

答案 2 :(得分:3)

托马斯,您对我们对参照完整性的担忧的评论回复中缺少的是您无法跨两个数据库执行foriegn密钥。如果这两个表位于一个数据库中,那么您可以使用foriegn键约束来确保在删除对象时,任何依赖于其对象id的内容也会被删除,以及其他类似的东西。

答案 3 :(得分:2)

虽然可以跨数据库进行连接,但我通常不会跨数据库分割数据,因为它们的类别略有不同。其他人也提到无法跨数据库使用引用完整性。

另一方面,如果每种类型的产品具有截然不同的前端应用程序,或者如果您希望每个数据库变得非常大,那么这些可能是考虑将它们留在不同数据库中的理由。 (虽然扩展对大多数现代数据库来说不是问题。)

跨数据库连接的语法示例:

SELECT *
FROM books b
INNER JOIN KeywordDB.dbo.Keywords k
ON b.keywordID = k.keywordID

在此示例中,您正在从包含books表的 local 数据库执行查询,并且您正在加入另一个数据库。 (这是一个MS SQL语法示例)

答案 4 :(得分:1)

不,这是一个坏主意。通过将它们分成不同的数据库,会严重影响您进行JOIN查询的能​​力。

答案 5 :(得分:1)

看起来确实有些过于分散,但有一些设计良好的视图,如果视图只是查找,它可能会起作用。

为什么首先要进行这样的分离?

答案 6 :(得分:1)

正如大家都提到的那样,一般来说,这不是一个好主意。 然而,扮演恶魔的倡导者,我见过其他开发者这样做。我确信有一些原因可能需要完成此操作,但如果绝对需要(不确定您是否要求解决方案),您可能希望使用某种同步来保持数据同步。拥有两个数据库中的所有(或需要的)数据。

这也不是一个理想的解决方案,但如果你必须使用两种不同的数据库类型,这可能是一种更好的方法来解决这个问题。

它至少可以解决每个人都在概述的问题 - 但请记住它确实会出现一个新问题...... 一切都在同步吗?

祝你好运,郎弗兰克

答案 7 :(得分:0)

如果关于是否使用一个或两个数据库的决定是你的,我建议只使用一个数据库。从您的问题来看,两个表中的数据似乎密切相关。大小和复杂性似乎不值得分成两个数据库。

你的DBMS是什么?如果是Oracle,DB2,SQL Server甚至是MS Access,那么在逻辑上相关的表中管理具有关键字数据和对象数据的单个数据库时应该没有任何问题。