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

时间:2011-10-26 08:49:02

标签: 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表,然后设置一个untilfrom列之间的依赖关系。我认为所有者可能想要更新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吗?

1 个答案:

答案 0 :(得分:1)

我不同意两个计数的nermalization例子。

  1. 最后没有猫实体。相反,有一个关系(cat_name_no,cat_name),在你的例子中有一个直接后果,你无法分辨出有多少名叫Lara的猫存在。这是一个很容易避免的异常现象。
  2. 该表将两个关系,lives_with_owner和under_the_name放在一个表中。这不是一个好主意,特别是如果数据是暂时的,因为它会产生各种令人讨厌的异常现象。相反,你应该为每个使用一个表。
  3. 我会按如下方式设计这个数据库:

    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,或者,如果经常需要该列,则可以使用视图处理。您不应手动管理内容,让数据库为您计算内容。