【问题标题】:I have account_id on all of the tables in the database that belong to an account. Could this be why our database is using a lot of memory?我在数据库中属于一个帐户的所有表上都有 account_id。这可能是我们的数据库使用大量内存的原因吗?
【发布时间】:2020-02-23 02:43:54
【问题描述】:

应用程序大量使用数据。这是一个房地产潜在客户管理系统,每个潜在客户都可以让我们的用户赚取数千美元,而意外退回其他人的潜在客户将是失去客户信任的必经之路。我们在客户端大量使用实体模式。这要求我们获取数据集合并将它们作为集合存储在客户端上。我在设计数据库时的想法是,如果我在每个表上都有帐户 ID,那么在不从其他帐户返回数据的情况下,通过更少或更多的性能查询,可以更轻松地获取所有数据。我意识到还有其他方法可以解决这个问题,但我们的截止日期很短,必须构建一个包含约 50 个表的完整应用程序,以便在 3 个月内发布测试版。话虽如此,我们还有许多查询大量使用连接和分组方法来防止 (n+1) 次访问数据库。仅仅是分析大量数据需要更大的数据库吗?最大的问题是我们目前只有 45 个活跃客户。该应用程序速度快,感觉很棒,我们只是在推动数据库内存的极限。当前数据库有 8Gb 内存。

这是我做的模式。我知道它没有对键进行标准化,但我读过的所有内容似乎都不会导致这个问题。但我不是数据库专家,如果有任何建议,我将不胜感激。

Account Table:
id
first_name
...etc

Record Table:
id
account_id
address
...etc

Analysis Table:
id
account_id
record_id
expected_return_on_investment
...etc

Comps Table:
id
account_id
record_id
analysis_id
cost
...etc

【问题讨论】:

  • 理论上,当您拥有record_id 时,您不需要account_id,因为您可以通过record 表访问该帐户。但是如果你实际上不需要来自record 的任何东西,那将是不必要的加入,直接加入account 会更容易。
  • 我就是这么想的,你认为有这样的索引可能是内存问题吗?目前,我们正在使用 8Gb 内存的服务器
  • 这取决于表有多大。你说你只有45个客户,那不是很多。但是,如果您为每个客户提供大量数据,那么它就会加起来。
  • 有很多权衡,如果不对实际应用程序进行基准测试,没有简单的方法来回答这个问题。
  • 真正的问题是什么?我在您的问题中找不到任何具体的内容。

标签: mysql foreign-keys denormalization database-indexes


【解决方案1】:

首先,为了更好地理解,我建议您使用实体关系图发布您的数据库。因为它很难理解,而且几乎没有信息,所以不可能知道你到底在问什么。尽管如此,我会尝试回答它(也许我没有回答你所期望的)。

Account 表 ID 应该是所有其他表上的 account_id。当对数据进行排序以获取(例如)来自客户端的所有记录时,您将使用account_id 搜索所有记录。然后,为了区分它们,您可以使用 id。此外,您不需要将account_id 添加到分析和比较;同样,您不应将record_id 添加到分析中。最后但同样重要的是,Comps 中不需要record_id。为什么?因为你有了父元素的 id,你可以获取存储在其中的其他 id。

顺便说一句,如果你想让它更安全,我会散列帐户 ID 并将它们存储在另一个变量中,我称之为 hashID。然后,我会将该哈希传递给其他表。如果有人未经授权获得了该哈希,他们将无法获取该 ID。如果您有权访问数据库,通过比较哈希值,您就知道您指的是哪个用户。但是,如果您不这样做,则无法从该哈希中获取更多信息(如果他有 id,是的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2011-02-07
    • 2011-02-14
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    相关资源
    最近更新 更多