-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_PK1, Table1_PK2, Table1_PK3... 是列,它们可能具有不同的数据类型(VARCHAR,INTDATETIME...)。我的问题是是否有一种方法可以创建一个可以代表所有这 3 个表的单个表(固定数量的列)(可能更实际)。

我正在尝试为我的数据库工具执行此操作。每个表实际上是一个包含主键和与之关联的哈希数据的表。

4

3 回答 3

1

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

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

我仍在寻找一种动态的方法来做到这一点,而不知道一个表可以有多少个主键。

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

一个表也可以有任意数量的其他键,它们要么被声明(as NOT NULL UNIQUE)要么“未声明”(通过创建一个索引来保证一组列的唯一性)。

您可以在运行时以两种方式中的一种或两种方式查看所有这些内容。(链接到 PostgreSQL 的文档。)

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

于 2012-09-01T11:37:57.707 回答
0

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

于 2013-12-11T12:45:44.937 回答
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以及FK_Table3_Hash将引用TableX_Hash记录值的列。

PS:我想知道您是否真正在寻找一张View而不是这张非常糟糕的一体式桌子。


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

将所有 _PK 连接到一列中:

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 数。

于 2012-08-31T17:51:09.603 回答