我有一个规范化的数据库,外键/主键提供一个到多个数据库。
我计划使用PHP访问此数据库以进行基本的前端/后端显示。现在,我的问题来自这两个示例查询:
CREATE VIEW `view` AS
SELECT
functiondetails.Detail,
functionnames.ID,
functionnames.FunctionName,
functionnames.Catogory
FROM functiondetails
INNER JOIN functionnames ON functiondetails.AsscID = functionnames.ID
或
SELECT
functiondetails.Detail,
functionnames.ID,
functionnames.FunctionName,
functionnames.Catogory
FROM functiondetails
INNER JOIN functionnames ON functiondetails.AsscID = functionnames.ID
查询中没有错误,因为我已经两次都没有失败,但我的整体问题是:
如果我打算经常从我的数据库中引用很多信息。是不是更容易创建一个视图,然后使用新添加的信息一直更新,或者更好的做法是在我的实际php上进行第二次查询。例如:
$Query = $MySQli->prepare("
SELECT
functiondetails.Detail,
functionnames.ID,
functionnames.FunctionName,
functionnames.Catogory
FROM functiondetails
INNER JOIN functionnames ON functiondetails.AsscID = functionnames.ID
")
$Query->execute();
$Results = $Query->fetch_results();
$Array = $Results->fetch_array(MYSQLI_ASSOC);
或者从我的视图中选择?
$Query = $MySQLi->prepare("SELECT * FROM `view`");
$Query->execute();
$Results = $Query->fetch_results();
$Array = $Results->fetch_array(MYSQLI_ASSOC);
那么哪一个用于查询我的数据库会更好?
答案 0 :(得分:6)
Views是abstraction layer,创建抽象层的通常原因是为您提供一种工具,让您的生活更轻松。
使用视图的一些重要优势包括:
安全强>
您可以控制谁有权查看,而无需授予他们访问基础表的权限。
<强>澄清强>
通常,列标题不像它们那样具有描述性。视图允许您为返回的数据添加清晰度。
<强>性能强>
表现明智,观点不会对你产生负面影响。但是,由于MySQL不支持materialized views,您不会通过使用视图获得性能提升。
轻松编码
视图可用于重用复杂查询,减少用户错误的空间。
易于管理
只要表格架构发生变化,它就会让您的生活更轻松
例如,假设您有一个包含待售房屋的表格homes_for_sale
,但稍后您决定要让该表格处理您目前有售的所有房屋,{{{ 1}}。显然,新表格的图式与第一张表格有很大不同。
如果您从all_homes
获得了大量查询,那么现在您必须浏览所有代码并更新所有查询。这将打开您的用户错误和管理噩梦。
解决更改的更好方法是使用相同名称的视图替换表。该视图将返回与原始表完全相同的模式,即使实际模式已更改。然后,如果需要,您可以按照自己的进度浏览代码,并更新查询电话。
答案 1 :(得分:5)
您可能假设MySQL在某处存储了视图的结果,并且随着基础表中的数据更改而导致更新。 MySQL没有这样做。查询视图与运行查询完全相同。
但它甚至比运行裸SQL查询更糟糕,因为MySQL可能会在临时表中累积基本查询的结果,因此您可以在查询中使用更多SQL子句来查看视图。我说“可能”因为它因视图算法而异。
有关MySQL如何使用“合并”算法或“temptable”算法执行视图的说明,请参阅http://dev.mysql.com/doc/refman/5.6/en/view-algorithms.html。
如果你想要物化视图,有一个名为FlexViews的工具可以维护物化视图:
Flexviews是MySQL的物化视图实现。它包含一个简单的API,用于创建实体化视图并刷新它们。使用Flexviews的优点是可以逐步刷新实例化视图,也就是说,通过使用记录数据库表更改的特殊日志来有效地更新视图。 Flexviews包括创建和维护这些日志的工具。 Flexviews创建的视图包括对JOIN和所有主要聚合函数的支持。
答案 2 :(得分:4)
如果你是:
,最好是创建视图答案 3 :(得分:4)
视图只是存储的文本查询。您可以对其应用WHERE和ORDER,执行计划将根据这些条款进行计算。我认为如果你想保持代码“干净”会很有用。 您需要记住的是,修改视图有点困难,因此如果您不太确定列,或者它会改变后者,请坚持查询。
关于表现是相同的!
祝你好运!
答案 4 :(得分:3)
性能方面,它们应该是相同的,但出于一些实际原因,这种观点会更好。
我更喜欢观看,因为它鼓励通过在一个地方更改它们来更好地重用和重构复杂查询,而不必在任何地方复制粘贴新版本,如果在多个地方使用查询。
对视图运行更新查询可能看起来更简洁,但请注意,有时您无法更新视图中属于不同基础表的多个列。因此,如果您必须更新2个不同的列,则必须运行两个不同的更新查询。
使用视图也很有意义,因为您将复杂的数据库逻辑卸载到它所属的数据库,而不是将其构建到应用程序代码中。
在使用视图的不利方面,如果您没有准备好数据库管理工具,那么设置可能会花费更长的时间。此外,如果您有很多观点,您可能需要提出一些方法来组织和记录所有观点。如果视图开始建立其他视图,这会变得更复杂。因此,您必须提前计划并维护依赖关系。