假设我有一张表作为我家的清单 - inventory_items
,如果你愿意的话。 inventory_items
包含我拥有的所有内容,但仅包含最常见的信息(即适用于我拥有的所有内容的字段,如名称,购买日期)。
我希望为electronics_data
创建一个单独的表,它是一个库存项目,但是有特殊信息要存储(比如说serial_number,瓦数),另一个用于furniture_data
包含家具特定信息( number_of_legs,material)。
在所有情况下,electronics_data
中的项目都会在{id}字段中链接inventory_items
中的匹配项。 furniture_data
也是如此。
如果我现在希望显示我的库存项目列表,但是包含子表格中的特定信息,从逻辑上讲,我认为要加载inventory_data
,找出这是什么类型的项目,并加载正确的右表中的信息。我可以想到两个更好的方法:
1)在inventory_items
和electronics_data
之间创建外键关系 - 因此加载所有项目也会获得我的所有子数据。 但是,inventory_items
中的所有项目都不会在electronics_data
中包含匹配的项目,这是否意味着外键无法正常工作?
2)创建一个视图,如果其中存在匹配项,则加载额外的表,并在我的应用程序中加载视图。 如果我有很多不同类型的'数据,这会使我的视图不必要地慢(检查所有内容)并实际上首先击败视图的对象吗?
这些是一般性问题 - 特别是2)我认为这是非常依赖数据的。
谢谢!
答案 0 :(得分:0)
如果您在提取数据时可以加入表格,那么它将使您的生活更轻松。有很多方法可以连接表,在你的情况下,如果你的所有表都有一个I.D列,那么你可以使用'Equijoin'这就是你可以这样做的方式
SELECT inventory_items.name, electronics_data.wattage, furniture_data.material
FROM inventory_items, electronics_data, furniture_data
WHERE inventory_items.i.d=electronics_data.i.d=furniture_data.id;
所以使用这样的连接你可以添加任意数量的列,但要确保突出显示它们来自的表,并在'WHERE'子句中显示它们相等的位置,否则它不会返回任何数据
答案 1 :(得分:0)
1)外键可以工作,因为专用表是子表,因此您需要确保子表中的每条记录在整个inventory_items表中都有相应的记录。反过来不一定正确。
2)视图可以left join
inventory_items表上的子表。如果连接中使用的字段在所有表中编制索引,则操作不是资源密集型的。如果您有许多专门的子表,最大的问题可能是如何构建视图。但这可能是一个更广泛的应用程序设计问题(如果你正在查看你的电子设备,那么你可能不希望看到家具项目表中的字段 - 在这些专门的视图中我会使用inner join
,而不是left join
)。
答案 2 :(得分:0)
我已对类似问题here发布了相当详细的回复,甚至如何定义您提及的观点。请注意,视图定义中显示的代码仅用于说明。它不会显示最有效的编写方式。然而,更好的方法应该是相当直接的。
关于视图性能的一个词。采用以查询
的方式连接非常大的表的视图select * from <view>
需要很长时间,比如30分钟。查询
select * from <view> where <criteria>
可能需要几分之一秒。在大多数现代DBMS中,where
条件与视图定义中的现有查询合并以执行查询。它不执行视图定义,然后执行过滤。因此,使用实际查询测试视图性能而不是“数据转储”查询。