我找到一种方法将多个表哈希表表示到一个表中。
假设我有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
,INT
或DATETIME
。 ..)。
我的问题是,是否有办法创建一个表(固定数量的列),可以代表所有这三个表(可能更实际)。
我正在尝试为我的数据库工具执行此操作。每个表实际上是一个表,其中包含主键和与之关联的哈希数据。
答案 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_Hash
,FK_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多个表减少,我们也可以在没有数据库关闭的情况下进行更改,从而避免收入损失。