7

我在这里有一个数据库设计,它以简化版本显示:

building

  • ID
  • 属性1
  • 属性2

里面的数据是这样的:

  • (1, 1, 1)
  • (2, 1, 2)
  • (3, 5, 4)

attribute1_valuesattribute2_values的结构如下:

  • ID
  • 价值

其中包含以下信息:

  • (1,“选项1的文字描述”)
  • (2,“选项2的文字描述”)
  • ...
  • (6,“选项6的文字描述”)

我不确定这是否是最好的设置,但它是按照我的项目经理的要求完成的。它肯定有一些道理,因为您现在可以轻松地修改文本而不会弄乱 id 的操作。

但是现在我来到了一个需要列出属性的页面,那么我该如何去那里呢?我看到两个主要选择:

1) 进行一个大查询,从表中收集所有值,building同时从attribute{x}_values表中选择正确的文本表示。

building2) 进行一个小查询,从表中收集所有值。然后,一次获得每个属性的文本表示。

最好的选择是什么?选项 1 是否比选项 2 更快?如果是这样,是否值得额外的维护麻烦?

4

7 回答 7

1

另一个建议是在服务器上创建一个视图,其中仅包含您需要的数据并从中查询。这将使工作保持在服务器端,并且您每次都可以提取所需的内容。

于 2013-12-09T15:15:15.677 回答
0

您的问题非常笼统,我认为要获得答案,您应该就该页面的外观以及数据集的大小提供更多提示。您将获得所有具有其属性的建筑物还是一次仅获得一个?因为你的数据结构看起来很简单,除了树莓派之外的任何东西都可以很好地处理它。

如果您一次需要一条记录,则不需要任何特殊技术,只需 JOIN 表即可。如果您需要列出所有建筑物并且想要节省数据库时间,则必须测量数据。如果您的属性多于建筑物,则必须选择一种方式,如果您有 8 个属性和 2000 个建筑物,您可以考虑将属性缓存在一个数组中,并为每个表选择一个选项,然后使用数组打印它们。我认为在现代计算机上使用如此简单的表格,您不会看到任何速度下降或改进。

$att1[1]='description1'
$att1[2]='description2'
....
于 2014-01-15T10:33:56.287 回答
0

我会推荐一些介于两者之间的东西。解析 php 中第一个表的结果,并计算出需要从每个 attribute[x]_values 表中选择多少个属性。

然后,您可以使用每个表一个查询而不是每个属性一个查询或每个建筑物一个查询来批量选择属性。

于 2013-11-05T23:17:42.003 回答
0

如果属性表中的行数很少,那么我建议先获取它们,然后将它们全部获取!使用 id 作为数组中的索引键将它们存储到某个数组中。

然后您可以继续构建数据,现在您只需使用相应的数组来查找属性值

于 2013-09-24T13:56:08.727 回答
0

这是一个PHP解决方案:

$query = "SELECT * FROM building";
$result = mysqli_query(connection,$query);
$query = "SELECT * FROM attribute1_values";
$result2 = mysqli_query(connection,$query);
$query = "SELECT * FROM attribute2_values";
$result3 = mysqli_query(connection,$query);
$n = mysqli_num_rows($result);
for($i = 1; $n <= $i; $i++) {
    $row = mysqli_fetch_array($result);
    mysqli_data_seek($result2,$row['attribute1']-1);
    $row2 = mysqli_fetch_array($result2);
    $row2['value'] //Use this as the value for attribute one of this object.
    mysqli_data_seek($result3,$row['attribute2']-1);
    $row3 = mysqli_fetch_array($result3);
    $row3['value'] //Use this as the value for attribute one of this object.
}

请记住,此解决方案要求表 attribute1_values 和 attribute2_values 从 1 开始,每行增加 1。

于 2013-12-31T07:41:11.037 回答
0

Oracle / Postgres / MySql DBA 在这里:

多次运行查询会产生相当多的开销。数据库有多次往返,如果它在远程服务器上,这可以加起来。数据库可能必须在 MySql 中多次解析相同的查询,如果有大量行,这将非常低效。现在,您的 PHP 方法(多个查询)的优势之一是它将使用更少的内存,因为它会在不再需要结果时释放结果(如果您将查询作为嵌套循环运行,即,但是如果您预先查询所有结果,则会有很多内存开销,具体取决于表大小)。

最佳结果是将其作为 1 个查询运行,并一次获取 1 个结果,根据需要显示每个结果并丢弃它,这可能会对 MVC 框架造成严重破坏,除非您愿意在视图中运行模型代码,或运行小的视图片段。

于 2013-12-31T07:49:02.937 回答
-1

永远不要一次做一个查询,尝试将它们组合成一个。

MySQL 将缓存您的查询,它会运行得更快。PhP 循环比对数据库执行许多请求要快。

查询缓存存储 SELECT 语句的文本以及发送到客户端的相应结果。如果稍后收到相同的语句,则服务器从查询缓存中检索结果,而不是再次解析和执行该语句。

http://dev.mysql.com/doc/refman/5.1/en/query-cache.html

于 2013-09-24T13:36:17.277 回答