【问题标题】:What MySQL table design is better on performance?什么 MySQL 表设计在性能上更好?
【发布时间】:2016-06-02 15:04:37
【问题描述】:

我必须创建一个包含大量数据的数据库应用程序。所以现在我需要一个好的表/数据库设计。我有两个想法,但我愿意接受新的。第一:这类似于我必须保存的数据:

食物:牛肉

包含:

溴:百分比:12% /// 克:0.23

铀:百分比:1% /// 克:0.003

黄金:百分比:0.03% /// 克:0.02

等等

现在我看到了两个设计:

对于每个元素(Brom、Gold、...),我创建了一个类似“brom_tbl、gold_tbl”的表和一个显示名称和全局 ID 的表 (gbl_tbl)。然后,当我想读取所有数据时,我只需将它们连接在一起。

这是第二个:

我只有一张这样的表:

名称 | brom_percent | brom_gram |黄金百分比 |金克| ...

牛肉 | 12 | 0.23 | 0.03 | 0.02

然后我就会把所有的东西都读出来。

如果你能告诉我什么更快或更好,那就太好了。

谢谢:)

【问题讨论】:

  • 使用一张表。并且不要使用像gbl_tbl 这样的名称,它不是 MS-DOS。
  • “gbl”应该是“全球”的意思吗?如果有意义,则将其命名为“全局”。更好的是,命名为“food_metal_content”或任何表格。因此,在 10 年内,当有人浏览您的(然后是 100 张不同的)表时,他们将能够找到正确的一张。无需使用神秘的缩写词。
  • 使用真实的话。没有理由写tbl 而不是table。这同样适用于代码中的变量名。未来的你和其他开发者会为此感谢你。
  • 太好了,现在剩下的工作日我的脑子里都会有“gibble tibble”。
  • @KirkBeard 通常根本没有理由在表名中写“表”。 users_table 可以是 users

标签: mysql database-design


【解决方案1】:

像这样创建两个表怎么样:

一个用于食物..

create table Food
(
 FoodId INT NOT NULL AUTO_INCREMENT,
 Name   varchar(1000)
)

还有一个用于属性:

create table Attributes
(
    AttributeId INT NOT NULL AUTO_INCREMENT,
    Description varchar(1000),
    FoodId      INT, /* Referencds FoodId in Food table */
    Value       Decimal,
    FOREIGN KEY (FoodId)
       REFERENCES Food(FoodId)
)

您可以使用属性名称和其他值(例如描述、化学符号)创建一个属性表。

然后有一个 FoodAttribute 表,其中包含每个食物/属性对的记录.. 一个经典的多对多连接。

【讨论】:

  • 为什么要创建 3 层参考?它使结构变得不必要地复杂,并且查询 OP 的“大量数据”需要更长的时间。我怀疑他们是否会经常在牛肉中发现一种以前不为人知的金属。
  • 谢谢,但我需要一个单独的表来存放FoodIdName 吗?我认为合并它们也没关系。
  • @c14L 如果食物中不含某种金属怎么办.. 所以你建议了一张桌子,每种矿物质都有一列?那会更快吗?我不是 MySQL 专家,但这有点逆风,不是吗?
  • @DisplayName123 如果名称位于单独的表中,则不一定需要在联接中包含该表;名称可以不那么频繁地获取并缓存在演示文稿“层”中,ID 足以解析 UI 中的名称并正确显示。
  • 不,这不是我的建议。根据 OP 的数据,您需要的只是 food_name 的一行,然后是每种金属的 metal_percentagemetal_grams 行。一个简单快速的布局,足以满足这个用例。如果您希望不时添加新属性,则创建单独的表是有意义的,但考虑到数据的主题,这不太可能。
【解决方案2】:

设计简洁

-- food FOOD has element ELEMENT associated with PERCENT percent and GRAMS grams
Food(food, element, percent, grams)

您不再解释这将有助于我们提供更合适的设计。显然重量是食物中的元素。假设您的 GRAMS 是某个标准重量食物中某个元素的重量,并且给定元素与每标准重量食物的标准重量相关联。那么:

-- standard weight of food FOOD is PERCENT percent element ELEMENT
Food(food, element, percent)
-- element ELEMENT has weight GRAMS grams per standard weight of food
Weight(element, grams)

那么前面的表值是这些表值的函数。

您需要清楚地表达表的谓词/含义(由上面的 cmets 表示),以便用户可以查看当前情况并能够知道要在表中放入什么值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-02
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2015-01-05
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多