Database design 数据库设计:如何在表中存储月份的天数?
在关系数据库中,如何在表中存储月份的天数? 对于一个项目,我必须根据每月的日期来保存价格。例如:Database design 数据库设计:如何在表中存储月份的天数?,database-design,Database Design,在关系数据库中,如何在表中存储月份的天数? 对于一个项目,我必须根据每月的日期来保存价格。例如: Day of month price -------------------- Day 1 32 Day 2 50 Day 29 60 Day 30 28 Day 31 49 在接下来的日子里,是否会有一个单独的专栏,尽管有点多余?例如,二月的天数从未超过29天。多个实体实例依赖于价格和天数。 为了简单起见,我
Day of month price
--------------------
Day 1 32
Day 2 50
Day 29 60
Day 30 28
Day 31 49
在接下来的日子里,是否会有一个单独的专栏,尽管有点多余?例如,二月的天数从未超过29天。多个实体实例依赖于价格和天数。为了简单起见,我不喜欢使用两个额外的表,分别节省月份和相关天数。如果使用MySQL,我只想让您更清楚一点
CREATE TABLE `pice_aganist_date` (
`day` tinyint(4) NOT NULL,
`price` int(11) DEFAULT NULL,
PRIMARY KEY (`day`)
)
最后,这就是我问题的解决方案。(感谢Mithu CN和Filburt) 将实体_id替换为要引用的列的名称 在关系数据库中,如何在表中存储月份的天数 通常,你不会。通常,您存储日期,并在需要时提取日期。此代码的一个潜在问题
CREATE TABLE `entity_prices` (
`day` tinyint(2) DEFAULT NULL,
`price` int(11) DEFAULT NULL,
`entity_id` int(11),
PRIMARY KEY (`day`, `entity_id`),
FOREIGN KEY (`entity_id`) REFERENCES Entities(`id`)
);
。对于每个实体,每天只能存储一行。例如,您可以将其存储
day price entity_id
--
1 13 27
2 14 27
3 13 27
...
25 15 27
将行{25,15,27}
存储在2018-09-25上后,您也不能将行{25,15,27}
存储在2018-10-25上
还有,第一行是当前数据吗?是去年遗留下来的,还是15年前遗留下来的?你看不出来。这可能违反了关系理论的基本原理之一:所有数据都由表中的列行表示。如果您知道第一行是最新的,那么该数据(关于第一行年龄的知识)来自数据库之外
还有,今天是25号。您不能为实体_id 27插入今天的行;你会得到一个重复的主键。相反,您必须更新第25行,或者在插入之前删除该行。这两种情况都会丢失行{25,15,27}
的数据
这些问题是否重要取决于应用程序,但它往往比不重要得多
如果存储的是日期而不是日期,则始终可以为今天的实体_id 27插入一行。您始终知道该行是表示当前日期、月份还是年份的数据。你总是可以在需要的时候抽出时间。(摘录(从日期算起的日期),其中介于“2018-09-01”和“2018-09-30”之间。
)。而且,如果您有一个可以在表达式上创建索引的dbms,或者如果您定期删除旧的行,则不会有实质性的性能损失
MySQL中建议的结构(复制于上面)也存在其他问题。列“day”声明为带符号的tinyint时,可以存储-128到127之间的值。这些值中的大多数是无效的,但是在MySQL中通常很难强制执行有效值(MySQL不强制执行检查约束),而且在存储“日”而不存储其月份时,基本上是不可能的。相反,存储日期可以解决这类问题
“价格”一栏也有类似的问题——所谓的价格永远不应该是负的。但是,如果不支持检查约束,数据库设计人员就只能寻找变通方法——外键、触发器等。日期取决于月份吗?就像1月1日,FebNo的1日一样,仅在2月最多有29天的意义上。我将以编程方式解决这个问题。我想知道除了制作31列之外,还有其他(更好的)方法吗;一个月的最大天数。创建31列肯定是错误的。如果你能以编程方式处理2月份,为什么不简单地创建31行日数和价格呢?然后你可以看看@Filburt提到的与另一个实体的关系当然会改变一些事情。其优点是,如果您需要单独处理几个月中的几天,那么所需的模式更改以及编程逻辑中的更改都相对简单。除非你有数百万个实体实例,否则任何像样的RDBMS都能很好地处理这个问题。同意,但我不清楚我的问题。我有多个实体实例,我必须将一个实体id添加到此表中,以使其适用于所有实体。不管怎样,如果这是最好的方法,我想我必须接受它。感谢您抽出时间回答@如果您能够优化给定一天的所有实体实例的查询价格的索引,那么ErrLand HER会考虑性能效益。@ ErcLand Hever对于每一个实体保持不同的价格,您可以添加EntyTyId,然后合成一个复合主键(EnthyTyId,Day)。谢谢@ Mithucn,从半小时前看到我的答案。
day price entity_id
--
1 13 27
2 14 27
3 13 27
...
25 15 27