表示多个表的单个表

时间:2012-08-31 17:16:04

标签: sql database database-design tree

我找到一种方法将多个表哈希表表示到一个表中。

假设我有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 个答案:

答案 0 :(得分:1)

由于您显然正在构建数据库工具而不是数据库,因此在应用程序代码而不是数据库表中执行此操作可能更有意义。

在另一个答案中,您评论了

  

我仍然在寻找一种动态的方法,而不知道一张桌子可以有多少主键。

一个表只能有一个主键。但是,该主键可以包含多个列。 (你已经知道了;你只是使用了错误的词,这可能会让其他人感到困惑。)

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

您可以通过两种方式中的一种或两种来查看运行时填充的所有。 (链接转到PostgreSQL的文档。)

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

答案 1 :(得分: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_Hash和{ {1}}列将引用记录的FK_Table3_Hash值。

PS:我想知道你真正想要的是TableX_Hash而不是这个真正糟糕的一体化表。


编辑:将它们组合成一个“不知道表可以有多少主键。”根据你的评论:

将所有连接的_PK存储在一列中:

View

) 您将无法根据其复合主键的部分方便地选择记录。它必须始终为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 。因此,您唯一的依赖是原始列中的PK数量。

答案 2 :(得分:0)

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