我使用PHP和mysql。
假设我有一个包含10 000行的数据库表。下面哪个案例最好的表现呢?
<案例1两个表,products
和categories
。
SELECT * FROM products INNER JOIN categories ON products.category_id = categories.id
产品
id
name
category_id
分类
id
name
<案例2
一个表products
,包含所有数据。
SELECT * FROM products
产品
id
name
category_name
从我的角度来看Case 1
是&#34;正确的&#34;这样做的方法,但我会使用Case 2
来节省一些开发时间。也许表现呢?
答案 0 :(得分:6)
评论太长了。第一种是存储该数据的正确(即SQLish)方式。它允许您执行以下操作:
表现不是主要考虑因素。 SQL引擎通过使用花哨的连接算法和索引来处理性能。这样做可以让您以最合理和可维护的方式为您的应用程序构建数据。
那说,哪个表现更好取决于许多因素(类别名称有多长,有多少不同的名称,产品记录有多宽)。在使应用程序以最佳方式工作时,两种方案之间的性能差异可能并不重要。
答案 1 :(得分:1)
案例1优于2,因为如果你要实现案例2,你最终会获得双重数据。通过双数据,我的意思是您将在“category_name”字段中多次使用相同的值。这有两个原因,首先是因为太多不必要的数据(双数据)会降低性能。第二个原因是因为效率。假设你想改变一个类别名称,比如饮料,它会在第二种情况下花费更多时间而不是第一种情况。 所以,为了回答你的第一个问题,案例1就是这样做的。
正如您可以想象的那样,通过阅读我对问题1的回答,案例1比案例2更快,因为案例2有不必要的数据。
你的最后一个问题,就像我在第一个问题的答案中解释的那样,案例2的一个缺陷就是你想要改变一个类别名称,你最终会以比案例1更多的工作来完成。案例1有我的知识没有陷阱。
答案 2 :(得分:0)
我认为问题是database design
为中心。
现在回答你的问题:
哪种情况会带来最佳表现?
回答 - 案例1.
<强>为什么吗
SQL
的基本Normalization
规则,它将帮助您进行更长时间的运行。如果将来您拥有超过10,000行,那么在单个表中处理它将会很繁琐redundant data
。indexing
列key
join
,则可以帮助您在大量行上更快地执行redundancy
次查询。Normalization
。为什么不是案例2?
单个表格将违反Case 2
规则。您的示例显示,使用单个表格会违反这些规则。
需要很长时间才能获得具有类似结构的10,000行吗?
使用案例1 :join
会花费一些时间,因为会涉及negligible
个查询。但这次会是indexing
并且也可以使用Case 1
来减少。
使用案例2 比redundant data
花费更少的时间,但由于join
或记录数量可能会导致其性能下降会成长。
可能陷阱?
案例1 -
public void count1() {
int min, max;
min = Integer.parseInt(JOptionPane.showInputDialog("lowest number"));
max = Integer.parseInt(JOptionPane.showInputDialog("highest number"));
String buff = "";
for (int i = min; i <= max; i += 7) {
buff += i + " ";
}
JOptionPane.showMessageDialog(null, buff);
}
查询。案例2 -
希望这对你有所帮助。