MySQL:在已经有created_at列的情况下,是否定义一个新的日期列来确定提取记录的日期是否好?
MySQL: Is it good to define a new date column to determine what date a record has been fetched when there is already a created_at column?
我需要一些关于数据库管理的帮助。我正在尝试从我的数据库中检索数据(通过 created_at 字段过滤它们)。
从今天创建的数据库中检索数据时不会有问题。
例如今天是 4/17。当我今天 运行 插入函数时, created_at 的值也将是 4/17。所以当我转到我的网页并显示 4/17 的数据时,数据将是正确的。
但是假设我忘记获取 4/15 的数据,我今天需要获取这些数据。当我现在将这些数据插入我的数据库时,created_at 将是 4/17,但相邻数据实际上是 4 /15.
现在,当我转到我的网页并显示 4/15 的数据时,我什么也得不到。
作为解决方法,我在 table 中添加了一个 date 字段,这将包含指定的日期,这与 created_field 不同服务器的日期。我现在使用 日期 字段来过滤我网页中的数据。
但是,我认为这是有些多余或低效的方法。有人有什么建议吗?
这是我当前 table 结构的屏幕截图:
由于您使用的是 Laravel,您可以在创建模型时简单地覆盖 created_at
值。例如,您可以执行以下操作:
$myModel->created_at = Carbon::parse('2019-04-15');
$myModel->save();
这会将 created_at
值设置为 4 月 15 日,而不是今天。因此,您的 table.
中不需要第二个 date
列
更新
尽管如此,如果您需要时间部分仍然反映当前时间,您可以执行以下操作:
$myModel->created_at = Carbon::now()->setYear(2019)->setMonth(4)->setDay(15);
$myModel->save();
接受的答案解决了 XY problem。这可能不是解决实际问题的方法。
将当前日期时间放入数据库的原因有很多(而不是约会或出生日期等数据中固有的日期时间)。虽然这不应该用于审计目的,但它对于调试和处理乐观锁定很方便。
但是在这里,您似乎在寻找一种事务控制机制 - 一种识别哪些记录已执行某些操作的方法。如果维护记录处理顺序的记录很重要,那么日期,甚至日期时间,甚至毫秒时间戳可能都不够。当您需要每天多次应用此操作时会发生什么?如果中途失败,需要恢复运行怎么办?这种机制也排除了一条记录可能有超过 2 个统计信息的概念。
假设对记录所做的事情是 ACID 事务的一部分,那么有 2 个状态需要考虑 - 之前和之后。您的数据域应该明确描述这两种状态(使用 null/non-null 日期值只是隐含的)。如果交易不是原子的,那么可能会有更多的状态需要考虑。
在 MySQL 的情况下,我会将其实现为枚举数据类型(具有非空约束)。但更一般地说,我试图通过使用包含在事务中的同步操作来避免像这样更新数据的情况。
我需要一些关于数据库管理的帮助。我正在尝试从我的数据库中检索数据(通过 created_at 字段过滤它们)。
从今天创建的数据库中检索数据时不会有问题。
例如今天是 4/17。当我今天 运行 插入函数时, created_at 的值也将是 4/17。所以当我转到我的网页并显示 4/17 的数据时,数据将是正确的。
但是假设我忘记获取 4/15 的数据,我今天需要获取这些数据。当我现在将这些数据插入我的数据库时,created_at 将是 4/17,但相邻数据实际上是 4 /15.
现在,当我转到我的网页并显示 4/15 的数据时,我什么也得不到。
作为解决方法,我在 table 中添加了一个 date 字段,这将包含指定的日期,这与 created_field 不同服务器的日期。我现在使用 日期 字段来过滤我网页中的数据。
但是,我认为这是有些多余或低效的方法。有人有什么建议吗?
这是我当前 table 结构的屏幕截图:
由于您使用的是 Laravel,您可以在创建模型时简单地覆盖 created_at
值。例如,您可以执行以下操作:
$myModel->created_at = Carbon::parse('2019-04-15');
$myModel->save();
这会将 created_at
值设置为 4 月 15 日,而不是今天。因此,您的 table.
date
列
更新
尽管如此,如果您需要时间部分仍然反映当前时间,您可以执行以下操作:
$myModel->created_at = Carbon::now()->setYear(2019)->setMonth(4)->setDay(15);
$myModel->save();
接受的答案解决了 XY problem。这可能不是解决实际问题的方法。
将当前日期时间放入数据库的原因有很多(而不是约会或出生日期等数据中固有的日期时间)。虽然这不应该用于审计目的,但它对于调试和处理乐观锁定很方便。
但是在这里,您似乎在寻找一种事务控制机制 - 一种识别哪些记录已执行某些操作的方法。如果维护记录处理顺序的记录很重要,那么日期,甚至日期时间,甚至毫秒时间戳可能都不够。当您需要每天多次应用此操作时会发生什么?如果中途失败,需要恢复运行怎么办?这种机制也排除了一条记录可能有超过 2 个统计信息的概念。
假设对记录所做的事情是 ACID 事务的一部分,那么有 2 个状态需要考虑 - 之前和之后。您的数据域应该明确描述这两种状态(使用 null/non-null 日期值只是隐含的)。如果交易不是原子的,那么可能会有更多的状态需要考虑。
在 MySQL 的情况下,我会将其实现为枚举数据类型(具有非空约束)。但更一般地说,我试图通过使用包含在事务中的同步操作来避免像这样更新数据的情况。