想象一下,您有一个存储易货的数据库。为简单起见,我们假设以物易物系统仅允许您将猫换成狗或将狗换成猫(但IRL可能会有更多组合)。
要跟踪每种易货行为,应备有barters
表。易货交易由输入和输出组成(例如,我用一只猫换了5只狗-我的输入是一只猫,输出是5只狗)。假设barter
和cats
是不同的表,并且都可以输入和输出,那么从dogs
行引用那些的最佳方法是什么?
如果这些实体非常相似,它们可能只是animals
而不是cats
和dogs
,情况将非常简单-barter
将有一个外键,引用animals
表中的ID。但是,如果我真的需要为这些实体使用不同的表,那最佳做法是什么?
例如我可以存储包含表名作为字符串的input_type
和output_type
,也可以有其他表inputs
和outputs
,其中每行将有两列-{ {1}}和table_name
(这样,我可以使用真正的外键来引用输入或输出)。哪个更好?什么是更好的解决方案,在此未提及?
答案 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)
要从上述设置中提取数据,您将需要为每个组合构建查询。
如果cats
和dogs
表的结构相同,则最好将数据存储在单个表中并添加一个type
列。如果结构千差万别,那么单独的表可能会更好。
例如:如果cats
由cat_name
,DoB
,Description
和dogs
组成的{{1} },dog_name
,DoB
,我只会使用一张表格。
请记住,这不只是存储数据,还需要能够有效地返回数据,无论是在此应用程序中还是在需要时通过报告返回。如果沿着单独的表格走,您的报告可能会需要过程来生成动态SQL来检索数据。