PostgreSQL参考数据可能在一个或另一个表中

时间:2018-07-31 09:38:47

标签: sql postgresql database-design

想象一下,您有一个存储易货的数据库。为简单起见,我们假设以物易物系统仅允许您将猫换成狗或将狗换成猫(但IRL可能会有更多组合)。

要跟踪每种易货行为,应备有barters表。易货交易由输入和输出组成(例如,我用一只猫换了5只狗-我的输入是一只猫,输出是5只狗)。假设bartercats是不同的表,并且都可以输入和输出,那么从dogs行引用那些的最佳方法是什么?

如果这些实体非常相似,它们可能只是animals而不是catsdogs,情况将非常简单-barter将有一个外键,引用animals表中的ID。但是,如果我真的需要为这些实体使用不同的表,那最佳做法是什么?

例如我可以存储包含表名作为字符串的input_typeoutput_type,也可以有其他表inputsoutputs,其中每行将有两列-{ {1}}和table_name(这样,我可以使用真正的外键来引用输入或输出)。哪个更好?什么是更好的解决方案,在此未提及?

2 个答案:

答案 0 :(得分:0)

我将用一个中间表来构造它。 在您的示例中,我将添加一个表,例如Transaction

制成:

id //transaction id
input_barter_id
date //could be useful

然后我将创建一个链接表,该表存储所有交易对象,我们称其为Transaction_detail,由

制成
id //could be not necessary
trasaction_id
output_barter_id

因此,在您的示例中,如果我用一只狗换了5只猫,我将在其中插入了1条狗到Transaction表中,并在其中插入5条狗到Transaction_detail表中,该表引用交易中的所有猫。

答案 1 :(得分:0)

要从上述设置中提取数据,您将需要为每个组合构建查询。

如果catsdogs表的结构相同,则最好将数据存储在单个表中并添加一个type列。如果结构千差万别,那么单独的表可能会更好。

例如:如果catscat_nameDoBDescriptiondogs组成的{{1} },dog_nameDoB,我只会使用一张表格。

请记住,这不只是存储数据,还需要能够有效地返回数据,无论是在此应用程序中还是在需要时通过报告返回。如果沿着单独的表格走,您的报告可能会需要过程来生成动态SQL来检索数据。