关于保存存储空间的相关表主键的探讨

时间:2012-10-17 20:55:29

标签: mysql sql primary-key

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

  • ID
  • box_name

BoxItems

  • ID
  • ITEM_NAME
  • belongs_to_box_id(外键)

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

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

所以现在我们得到以下内容而不是以上内容:

BoxItems

  • 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开发我的应用程序

2 个答案:

答案 0 :(得分:0)

我建议为这两种方法编写一个简单的测试,并比较性能,磁盘空间和易于实现,并进行判断调用。你的两个建议都是合理的,我怀疑性能会有很大的不同,但最好的方法就是尝试一下,然后你肯定会知道。

答案 1 :(得分:0)

当你考虑它时,“盒子/内容”问题和“订单/订单项”问题之间真的没什么区别。

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个值足够。在每天获得数百万行的表中纠正错误可能会很昂贵。