我正在尝试创建一个这样的表:
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
列之间的依赖关系。我认为所有者可能想要更新cat的信息,并覆盖'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吗?
答案 0 :(得分:1)
我不同意两个计数的nermalization例子。
我会按如下方式设计这个数据库:
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作为范围的nermalization示例中可能会导致查询语法混乱),因此您可以询问select cat_id from owner where '2000-06-02' between valid_from and valid_to
之类的查询。
至于在一般情况下如何处理时态数据的问题:有一本关于这个主题的优秀书籍,“在SQL中开发面向时间的数据库应用程序”,作者:Richard Snodgrass(free full-text PDF distributed by Richard Snodgrass),我相信它甚至可以合法下载为pdf,谷歌将帮助您。
您的另一个问题:您可以在外部的sql中处理combined_family_age,或者,如果经常需要该列,则可以使用视图处理。您不应手动管理内容,让数据库为您计算内容。