我正在尝试创建一个这样的表:
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?
最佳答案
我在两个方面不同意归一化示例。
- 最后没有猫实体。相反,存在一个关系 (cat_name_no, cat_name),在您的示例中,它的直接后果是您无法判断存在多少只名为 Lara 的猫。这是一种很容易避免的异常情况。
- 该表将两个关系 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/