Mysql 在相关表上设置主键以节省存储空间的方法

Mysql 在相关表上设置主键以节省存储空间的方法,mysql,sql,primary-key,Mysql,Sql,Primary Key,我有一个关于关系数据库中主键的问题。假设我有以下表格: 盒子 身份证 箱名 箱形物品 身份证 项目名称 属于\u框\u id(外键) 我们还假设我打算每天储存数百万件物品。我可能会对BoxItems.Id使用bigint或guid 我所想的,我需要你的建议,是用顺序的TinyInt编号代替盒子项目的Bigint Id,每个项目识别的是所属盒子Id和TinyInt行的组合(例如,项目编号) 因此,现在我们得到的不是上面提到的: 箱形物品 属于\u盒\u id 项目序列号[TINYINT]

我有一个关于关系数据库中主键的问题。假设我有以下表格:

盒子

  • 身份证
  • 箱名
箱形物品

  • 身份证
  • 项目名称
  • 属于\u框\u id(外键)
我们还假设我打算每天储存数百万件物品。我可能会对BoxItems.Id使用
bigint
guid

我所想的,我需要你的建议,是用顺序的
TinyInt
编号代替盒子项目的Bigint Id,每个项目识别的是所属盒子Id和TinyInt行的组合(例如,项目编号)

因此,现在我们得到的不是上面提到的:

箱形物品

  • 属于\u盒\u id
  • 项目序列号[TINYINT]
  • 项目名称
例如:

Items.Insert(1,1, "my item 1");
Items.Insert(1,2, "my item 2");
因此,我可以使用tinyint并节省大量磁盘空间,而不是使用bigint或GUID


我想知道这种方法的利弊。我正在使用MySQL和ASP.NET 4.5开发我的应用程序,我建议为这两种方法编写一个简单的测试,比较性能、磁盘空间和易实现性,并做出判断。你的两个建议都是合理的,我怀疑在性能上会有很大的差异,但最好的办法是尝试一下,然后你就会确定。

仔细想想,“盒子/内容”问题和“订单/商品”问题之间其实没有太大的区别

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


确保256个值足够。在一个每天有数百万行的表中,纠正错误可能需要花费高昂的代价。

您需要解释如何处理数据。物理数据结构由应用程序需求驱动。毕竟,如果你想节省大量空间,根本不要存储任何东西。我从你的答案中删除了签名,它们不应该包含在答案中,但请随意将其放在你的个人资料页上。
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
);