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