php - 如何在 Nermalization 中跟踪更改和存储计算内容?

标签 php mysql database-design

我正在尝试创建一个这样的表:

lives_with_owner_no from    until   under_the_name
1                   1998    2002    1
3                   2002    NULL    1
2                   1997    NULL    2
3                   1850    NULL    3
3                   1999    NULL    4
2                   2002    2002    4
3                   2002    NULL    5

the Nermalization example ,我想这很受欢迎。

无论如何,我想我应该在 MySQL 中为 from 设置一个依赖关系。等待更改 lives_with表或 cat_name表,然后设置 until 之间的依赖关系和 from柱子。不过,我想主人可能想来更新猫的信息,并覆盖“来自”列,所以我必须使用 PHP 吗?有什么特殊的方法我应该在覆盖上做时间戳(例如, $date = date("Y-m-d H:i:s"); )?如何在 MySQL 中设置依赖关系?

我还有一列可以通过将其他列加在一起生成。我想使用 cat 示例,它看起来像:

combined_family_age family_name
75                  Alley
230                 Koneko
132                 Furrdenand
1,004               Whiskers

我应该通过 PHP 添加然后通过查询输入值,还是应该使用 MySQL 来管理添加?我是否应该为此使用特殊的引擎,例如 MemoryAll?

最佳答案

我在两个方面不同意归一化示例。

  1. 最后没有猫实体。相反,存在一个关系 (cat_name_no, cat_name),在您的示例中,它的直接后果是您无法判断存在多少只名为 Lara 的猫。这是一种很容易避免的异常情况。
  2. 该表将两个关系 lives_with_owner 和 under_the_name 塞进一张表中。这不是一个好主意,尤其是当数据是临时的时,因为它会产生各种令人讨厌的异常情况。相反,您应该为每个人使用一个表格。

我会按如下方式设计这个数据库:

create table owner (id integer not null primary key, name varchar(255));
create table cat (id integer not null primary key, current_name varchar(255));
create table cat_lives_with (
  cat_id integer references cat(id),
  owner_id integer references owner(id),
  valid_from date,
  valid_to date);
create table cat_has_name (
  cat_id integer references cat(id),
  name varchar(255),
  valid_from date,
  valid_to date);

所以你会有这样的数据:

id | name 
 1 | Andrea
 2 | Sarah
 3 | Louise

id | current_name
 1 | Ada
 2 | Shelley

cat_id | owner_id | valid_from | valid_to
     1 |        1 | 1998-02-15 | 2002-08-11
     1 |        3 | 2002-08-12 | 9999-12-31
     2 |        2 | 2002-01-08 | 2001-10-23
     2 |        3 | 2002-10-24 | 9999-12-31

cat_id | name     | valid_from | valid_to
     1 | Ada      | 1998-02-15 | 9999-12-31
     2 | Shelley  | 2002-01-08 | 2001-10-23
     2 | Callisto | 2002-10-24 | 9999-12-31

我会使用比年份更细粒度的日期类型(在以 2002-2002 为范围的规范化示例中确实会导致查询语法困惑),这样您就可以像 select cat_id from owner where 这样的查询'2000-06-02' 在 valid_from 和 valid_to 之间。 至于在一般情况下如何处理时态数据的问题:有一本关于这个主题的优秀书籍,由 Richard Snodgrass (free full-text PDF distributed by Richard Snodgrass) 撰写的“Developing Time-Oriented Database Applications in SQL”,我相信这甚至是合法的下载为 pdf 格式,Google 会帮助您。

您的另一个问题:您可以在外部的 sql 中处理 combined_family_age,或者,如果经常需要该列,则可以使用 View 。不过,您不应该手动管理内容,让数据库为您计算。

关于php - 如何在 Nermalization 中跟踪更改和存储计算内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7900511/

相关文章:

php - MySQL 单表中的多个表

sql - 如何为我的数据创建交叉引用表/查询?

php - Laravel 5.1 - 如何从 S3 存储桶下载 pdf 文件

javascript - responseText 不返回成功消息

php - 如何按两列对 MySQL 查询进行排序

database-design - 类似于 Facebook 的通知系统的数据库架构

sql - 将同一个表中的 2 个主键列连接到 1 个外键列

php - 选择一个月中每一天的计数

NGINX 上的 PHP 未加载 php.ini

MySQL,更新语法为一个值添加多个ID