【问题标题】:Approach to Primary Key on Related Tables to Save Storage Space相关表主键节省存储空间的方法
【发布时间】:2012-10-08 05:39:54
【问题描述】:

我对关系数据库中的主键有疑问。假设我有以下表格:

盒子

  • 身份证
  • 盒子名称

盒子物品

  • 身份证
  • item_name
  • belongs_to_box_id(外键)

我们还假设我打算每天存储数百万个项目。我可能会使用 bigintguid 作为 BoxItems.Id。

我在想什么,我需要你的建议,而不是 BoxItems 的 Bigint Id,使用连续的 TinyInt 数字,并且标识每个项目的是 belongs_to_box_id 加上 tinyint 行的组合(例如 item_numner )。

所以现在我们得到的是:

盒子物品

  • belongs_to_box_id
  • item_sequence_number [TINYINT]
  • item_name

例子:

Items.Insert(1,1, "my item 1");
Items.Insert(1,2, "my item 2");

因此,我可以使用 tinyint 并节省大量磁盘空间,而不是使用 bigint 或 GUID。

我想知道这种方法的优缺点。我正在使用 MySQL 和 ASP.NET 4.5 开发我的应用程序

【问题讨论】:

  • 你需要解释你想对数据做什么。物理数据结构由应用程序需求驱动。毕竟,如果你想节省大量空间,就不要存储任何东西。

标签: mysql sql primary-key


【解决方案1】:

仔细想想,“盒子/内容”问题和“订单/订单项”问题之间并没有太大区别。

create table boxes (
  box_id integer primary key,
  box_name varchar(35) not null
);

create table boxed_items (
  box_id integer not null references boxes (box_id),
  box_item_num tinyint not null,
  item_name varchar(35) not null
);

对于 MySQL,您可能会使用无符号整数和无符号 tinyint。数据库没有令人信服的理由来避免负数,但开发人员应该依靠Principle of Least Surprise

确保 256 个值就足够了。在每天包含数百万行的表中,如果要纠正这个错误可能会付出高昂的代价。

【讨论】:

    【解决方案2】:

    我建议为这两种方法编写一个简单的测试,比较性能、磁盘空间和实施的难易程度,然后做出判断。你的两个建议都是合理的,我怀疑性能上会有很大差异,但最好的方法是尝试一下,然后你就知道了。

    【讨论】:

    • 我从您的答案中删除了签名,它们不应包含在答案中,但请随时将其放在您的个人资料页面上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2016-05-06
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多