【发布时间】:2012-01-31 13:39:20
【问题描述】:
我面临的情况是,我正在尝试以最佳方式(就内存存储使用而言)来表示不同商店在不同时间点持有的库存。设置如下:
表格:商店
一个表,它是不同商店的列表:
- 商店 ID (PK)
- 商店名称
- ...其他详细信息
表格:库存
- 库存编号 (PK)
- 股票名称
- ...其他详细信息
表格:Store Stock Holdings
- 商店 ID
- 库存编号
- 日期
- 数量
(Store Id、Stock Id 和 Date 作为联合主键,Store Id 和 Stock Id 作为外键)
另外,我想将持有的股票存储为 json 字符串:
表格:Store Stock Holdings
- 商店 ID
- 日期
- 持股
例如,假设商店 1 在 2011 年 1 月 1 日有 50 个柠檬(代码 = 1)、100 个橙子(代码 = 2)和 20 个芒果(= 3),那么这三个设置将表示为:
选项 1:
Store Id, Stock Id, Date, Quantity
1 , 1, 2011-01-01, 50
1 , 2, 2011-01-01, 100
1 , 3, 2011-01-01, 20
选项 2:
Store Id, Date, Stock Holdings
1 , 1, 2011-01-01, \{1,50;2,100;3,20\}
选项 3:
将通过将选项 1 拆分为两个表来减少存储日期的复制,如下所示:
Index, Store Id, Date
1, 1, 2011-01-01
Index, Stock Id, Stock Holdings
1, 1, 50
1, 2, 100
1, 3, 20
所以问题是:
对于不同的实现,我的速度和存储考虑因素是什么。我的想法是选项 3 和选项 2 可能是更好的选择,因为没有复制日期信息。
对于选项 2,存储 JSON 字符串的内存是否是动态分配的?我的意思是 JSON 字符串可能非常大,因此需要允许它。那么新条目会占用总分配量还是仅占用基于 JSON 字符串所需的内存量?我的理解是使用 varchar 会动态分配内存。你会建议使用 varchar 吗?
【问题讨论】:
-
对于选项#3,“索引”字段是什么?如果它是代理键(自动编号),那么您可能可以改用“Stock ID”(除非我错过了什么)。
标签: mysql memory normalization