【问题标题】:SQL inheritance performanceSQL 继承性能
【发布时间】: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


【解决方案1】:

在性能方面,有几个参数需要考虑,第一个是要知道您要存储的数据量有多大,如果您只有几百个条目,您不会注意到两者之间的巨大差异这两种方法。

真正的问题更多是关于您的需求。例如,如果您需要存储有关不同 levels(名称、难度、...)的信息,则第二种解决方案显然不是一个选择,因为!如果您想存储有关已保存事件的信息(日期、游戏进程...),情况相同。

在考虑构建将返回所需结果的查询的方法之前先考虑需求。

希望这将帮助您更好地理解在需要设计数据库结构时采用的方法。

【讨论】:

  • 非常感谢,很抱歉没有更新。最后我们使用了多表方法,因为我们在每种类型中都有许多其他关系和特定列,而且我真的不喜欢有 NULL-able 列,正如我的伙伴所说(我赢得了讨论 *teehee*)跨度>
猜你喜欢
  • 2012-06-27
  • 2013-08-14
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
相关资源
最近更新 更多