在访问/处理复杂数据时,将其存储为许多小块还是一大块更好?


11

我正在构建一个处理相当复杂的数据的Web应用程序:吉他标签。

    As a reference, guitar tabs look like this:
Eb|-------------------------------------------------------------------------|
Bb|-------------------------------------------------------------------------|
Gb|--5-5-5-5----------------------------------------------------------------|
Db|--5-5-5-5--3-3-3-3--7-7-7-7--5-5-5-5--2-2-2-2--3-3-3-3--2-2-2-2--5-5-5-5-|
Ab|--3-3-3-3--3-3-3-3--7-7-7-7--5-5-5-5--2-2-2-2--3-3-3-3--2-2-2-2--5-5-5-5-|
Eb|-----------1-1-1-1--5-5-5-5--3-3-3-3--0-0-0-0--1-1-1-1--0-0-0-0--3-3-3-3-|

将这些数据作为大块存储,或者将其分解并按“逐个记录”的方式存储,会提高性能吗?

As a use case:
User changes first chord from:       to:
                         Eb|---   Eb|---
                         Bb|---   Bb|---
                         Gb|--5   Gb|--4
                         Db|--5   Db|--4
                         Ab|--3   Ab|--2
                         Eb|---   Eb|---

如果我将其存储为块,则操作选项卡的代码将必须复杂得多。如果我逐条记录存储,则将需要更多地访问数据库。哪种方法更有效?潜在地,许多用户将修改数据。我想要性能最好的Web应用程序。如果这完全影响答案,我将使用MySQL。


2
为了什么更好?节省空间?CPU能力?IO?还有吗
Oded 2012年

嗯,这是一个网络应用程序。许多用户可能会相当频繁地修改数据。我想像您提到的许多因素会对它产生不同的影响。我不太熟悉这些细节。这就是我在这里问的部分原因。
·威拉德

如果您不知道要优化什么,我们该如何回答?问题是-首先构建它,如果您有特定的问题,然后询问如何解决它们。
Oded 2012年

12
您在构建数据库之前不先设计数据库吗?我的问题是关于设计数据库。不排除故障。我还没有进入调试阶段,即使我处于调试阶段,也可以转到StackOverflow,而不是Programmers。按照常见问题解答:程序员涵盖了算法和数据结构的概念,设计模式,软件体系结构,软件工程……不是解决瓶颈问题。
·威拉德

+1非常有趣的问题和出色的工作插图,这是一个有用的用例。让我希望我有一个很好的借口现在可以开发一个吉他标签应用。
Evan Plaice 2012年

Answers:


8

两种方法的操作次数将相同。您进行一次查询以获取一首歌的所有和弦,然后在每次进行更改时进行一次更新。真正的区别在于更新的大小。使用块方法,每次更改和弦时都必须保存首歌曲。使用单独的方法,您的更新将更小,并且总体上可能更高效,尽管差异可以忽略不计。

要考虑的另一件事是逐个注释的方法更加规范化,这意味着如果使用它,您将有更多的查询选项可供您使用。例如,初学者可以在搜索要学习的歌曲时滤除他们不知道的和弦,或者,如果有人不知道歌曲名称,则可以允许基于开头的和弦进行搜索。即使您现在不计划这些功能,但是如果以后想要类似的东西,更改数据库也将是巨大的痛苦。


5

一般来说,归一化比较好是出于以下几个原因:

  1. 减少重复数据,从而减小物理数据库的大小。
  2. 更好的数据完整性-您可以使用外键强制执行某些要求。
  3. 您已经确定的更简单的更新代码。
  4. 对数据子集的更多可索引访问路由。

缺点(在此进行了详细介绍)包括:

  1. 标准化可以节省空间,但是空间便宜。
  2. 规范化可简化更新,但读取更为常见。
  3. 通常,使用规范化程度较低的模式会提高性能。

我建议从更规范的设计开始,如果遇到性能问题,仅考虑取消规范化。


借助吉他标签数据库,简单性,一致性和完整性优于性能。因此,我将使用我能想到的最简单的规范化架构。
9000

2

使您的存储最容易使用,并且足够坚固以防损坏。使用合理的标准化架构。如果可能的话,请使用不排除第一个发行版中不需要的用法的架构。

如果所有你需要的是显示一个特定歌曲的标签,你可以存储大量的6元组在一个面向文档的数据库(如MongoDB的),取它们作为一个文档。

在RDBMS中,我将类似地将其存储在这样的表中:

table tab_column (
  song_id integer not null foreign key references song(id),
  ordinal integer not null, -- position in the tabulature
  s1 number(2), -- position on 1st string
  ...
  s6 number(2),
  primary key(song_id, ordinal)
)

RDBMS擅长于简单的查询,例如显示歌曲所需的查询:

select * from tab_column
where song_id = :song_id
order by ordinal;

使用limitoffset,您可以显示歌曲的一部分。

以后tab_column,如果您可以识别和弦,则很容易链接到列出名为和弦的表格。

这可能是最简单的方案。我将从它开始。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.