MySQL - 适用于VIEWS或FOREIGN KEYS的应用程序

时间:2016-11-02 19:44:56

标签: mysql database-design entity-attribute-value

假设我有一张表作为我家的清单 - 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_itemselectronics_data之间创建外键关系 - 因此加载所有项目也会获得我的所有子数据。 但是,inventory_items中的所有项目都不会在electronics_data中包含匹配的项目,这是否意味着外键无法正常工作?

2)创建一个视图,如果其中存在匹配项,则加载额外的表,并在我的应用程序中加载视图。 如果我有很多不同类型的'数据,这会使我的视图不必要地慢(检查所有内容)并实际上首先击败视图的对象吗?

这些是一般性问题 - 特别是2)我认为这是非常依赖数据的。

谢谢!

3 个答案:

答案 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条件与视图定义中的现有查询合并以执行查询。它不执行视图定义,然后执行过滤。因此,使用实际查询测试视图性能而不是“数据转储”查询。