【发布时间】:2013-11-18 22:03:38
【问题描述】:
在 SQL 数据库(更具体地说是 MySQL)中有一个表,其中的行可以有两种含义。
为了了解上下文,表格代表了游戏的状态。然后每一行可能是一个保存状态游戏或初始游戏状态(代表关卡)。
我与我的队友进行了一些讨论,关于如何设计/实施它。我总是被告知这样做:
CREATE TABLE games (
id INT,
PRIMARY_KEY (id)
)
CREATE TABLE levels (
id INT,
PRIMARY_KEY (id),
FOREIGN_KEY (id) REFERENCES games(id)
)
CREATE TABLE saved (
id INT,
PRIMARY_KEY (id),
FOREIGN_KEY (id) REFERENCES games(id)
)
比这样做“更好”:
CREATE TABLE games (
id INT,
`type` ENUM('level', 'saved')
PRIMARY_KEY (id)
)
在第一种情况下,将使用“join”从保存中提取,而在第二种情况下,将使用“where type=level”。
那么,在设计和数据库性能方面,有什么更好的呢?
我们更关心性能,但我们真的不知道 join 是否比带有 where 的简单 select 慢很多。
【问题讨论】:
-
这不是性能问题(嗯,不仅如此)。基本的事情是 - 这些结构指向不同的关系,你需要决定哪个适合你的应用程序的逻辑
-
但是即使这两种类型(级别和已保存)之间存在不同的关系,也可以将所有内容放在一个表中,从而使列可选(NULL-able)。所以“级别”行会有一些列为空,而“保存”会有其他列。这会“好”吗?它会提高还是降低性能?
标签: mysql sql select join where