2012-08-31 25 views
-1

我找到一种方法将多个表散列表代表到单个表中有问题。代表多个表的单个表

说我有3代表的格式:

Table1(Table1_PK1,Table1_PK2,Table1_PK3,Table1_Hash) 
Table2(Table2_PK1,Table2_PK2,Table2_Hash) 
Table3(Table3_Pk1,Table3_PK2,Table3_PK3,Table3_PK4,Table3_PK5,Table3_Hash) 

Table1_PK1Table1_PK2Table1_PK3 ......在列,他们可能有不同的数据类型(VARCHARINTDATETIME ...)。 我的问题是,如果有一种方法可以创建一个表(固定数量的列),可以代表所有这3个表(可能更实际)。

我想为我的数据库工具做到这一点。每个表格实际上是一个包含主键和与它们相关的散列数据的表。

+1

他们是否有外键或某种方式来识别哪些行属于一起? –

+0

否。每个表中除Hash字段外的所有字段都是主键(复合主键)。 例如:Table1_PK1,Table1_PK2,Table1_PK3是表1中的主键 – stoney78us

+0

请解释_why_你想合并它们吗?有可能有更好的方法来实现你想要实现的任何目标...... –

回答

0

为什么将3个表合并为一个?会很糟糕的分贝设计。但这里有一个办法做到这一点:

一个表将有你在决赛桌要为每个3代表列的列。我想提出的假设是TableX_Hash是同一类型的,所以仍然是一个独特的列:

Table_All_in_One (
    Table1_PK1, 
    Table1_PK2, 
    Table1_PK3, 
        # space just for clarity of grouping 
    Table2_PK1, 
    Table2_PK2, 

    Table3_PK1, 
    Table3_PK2, 
    Table3_PK3, 
    Table3_PK4, 
    Table3_PK5, 

    TableX_Hash  # Assuming all the _Hash'es are the same type+length, 
        # otherwise, add Table1_Hash, Table2_Hash, Table3_Hash 
        # This can be your new primary key 
) 

的主键(PKx)被要求只在自己的表非NULL。对于这张表,他们必须允许空值。 这个想法是,这个新表的每一行只会保存其中一个表的数据。该行的其他列将为空。如果你想一个表的行与另一个相关联,您可以添加到同一行或添加FK_Table1_HashFK_Table2_HashFK_Table3_Hash列,这将是指记录的TableX_Hash值。

PS:我不知道你真正寻找的是一个View,而不是这个非常糟糕的所有功能于一身的表。


编辑:将它们组合成一个“不知道表有多少个主键”。按您的评论:连接成一列

店内所有_PKs:

Table_All_in_One (
    New_PK, 
    TableX_Hash, 

    Table1_PKx,  # Concatenated PKs of Table1 
    Table2_PKx,  # Concatenated PKs of Table2, etc. 
    ..., 
        # OR just one 
    TableX_PKs,  # concatenate all the PK's into one VARCHAR field 
        # Add a pipe `|` between them optionally. 
    Table_Num  # If using just one, then you'll need to store the table number 

) 基于它们的复合主键的一部分将不能够方便地挑选记录。它将始终是TableX_PKs = CONCAT_WS('|', Table1_PK1, Table1_PK2, ...)。所以你唯一的依赖是原始列中PK的数量。

+0

感谢您的文章,但这不是我正在寻找的内容。所有3个表格在所有领域都是独立的。比方说,如果我想将Table10的10个主键的10列数据添加到Table_All_in_One中,这会失败。 – stoney78us

+0

即使这样,这也可以正常工作。你只需要确保'Table_All_in_One'具有所有其他表的所有列。当您将表10的10列数据添加到All_in_One(“Table10_PK1,_PK2 ...,PK10”)时,All_in_One(“Table2_PK1,Table3_PK5”等)的其余列将为空/ NULL。 – aneroid

+0

嗯...我仍然在寻找一种动态的方式来做到这一点,而不需要知道表中有多少个主键。 – stoney78us

1

既然你显然建库工具,而不是一个数据库,它可能会更有意义在应用程序代码,而不是在数据库表来做到这一点。

在一个不同的答案,您的评论

我仍然在寻找一个动态的方式做到这一点不知道一个表可以有多少主键有。

甲表只能有一个主键。不过,该主键可以由多个列组成。(您已经知道这一点;您只是使用了错误的词汇,这可能会让其他人感到困惑。)

表中还可以包含任意数量的其他键,这些键将被声明(如NOT NULL UNIQUE)或“未声明”(通过创建一个索引来保证一组列的唯一性)。

你可以看看全部在运行时以一种或两种方式填满。 (链接到文档的PostgreSQL。)

据我所知,所有的现代SQL平台实现这些接口中的至少一个。 SQL标准涵盖了information_schema视图,但似乎还有一些解释空间。在所有平台上它们看起来都不一样。

0

为了建模一堆表格,你需要3个表格。包含您希望以此方式设置的表的表名称的实体表称为因子或实体表。包含表格的所有列及其关联属性的Factor_detail表。一个表,factor_detail_value,用于存储查找表的查找值等内容。我也试图更好地了解这一点,因为我们也在使用这种技术。为任何如此编码的表提供Genrate SQL,并将数据存储在与数据本身相关的存储库中。这样,如果表更改并且需要添加列或更改数据类型,则可以向因子详细信息表中添加一行,而不影响数据库在生产中的关闭。在大多数企业中,关闭一个四小时以更改sql数据表可能会花费数千美元。例如,如果您正在处理保险业务,那么您销售保险的每个其他州都有不同的要求,因此可以对其进行调整并导致表格更改。我们通过这种方式将表格数量从700多个表格中减少,同时我们也可以在没有数据库关闭的情况下进行更改,从而避免收入损失。