Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何跟踪更改并将计算内容存储在Nermalization中?_Php_Mysql_Database Design - Fatal编程技术网

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

Php 如何跟踪更改并将计算内容存储在Nermalization中?,php,mysql,database-design,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

我正在尝试创建如下表:

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
是的,我想这很受欢迎

无论如何,我想我只是应该在MySQL中为
from
设置一个依赖项,等待更改
lives\u with
表或
cat\u name
表,然后在
until
from
列之间设置一个依赖项。我想主人可能会来更新猫的信息,然后覆盖“from”列,所以我必须使用PHP?是否有任何特殊的方法可以在覆盖上标记时间(例如,
$date=date(“Y-m-dh:I:s”);
?如何在MySQL中设置依赖关系

我还有一个可以通过将其他列添加到一起生成的列。我想用cat的例子,它看起来像:

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

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

我在两个方面不同意nermalization示例

  • 最终没有cat实体。取而代之的是一种关系(猫名,猫名),在你的例子中,这种关系的直接后果是你无法判断有多少只猫叫劳拉。这是一个很容易避免的异常现象
  • 该表将两个关系塞入一个表中,分别与\u所有者和\u名称下的\u生活在一起。这不是一个好主意,尤其是如果数据是暂时的,因为它会产生各种令人讨厌的异常。相反,您应该为每个应用程序使用一个表
  • 我将按如下方式设计此数据库:

    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
    
    我会使用比年份更细粒度的日期类型(在nermalization示例中,将2002-2002作为一个范围可能会导致混乱的查询语法),这样您就可以查询
    从所有者选择cat\u id,其中'2000-06-02'介于valid\u from和valid\u to
    之间。 至于如何在一般情况下处理时态数据的问题:Richard Snodgrass()的《用SQL开发面向时间的数据库应用程序》(Developing Time-Oriented Database Applications in SQL)是一本关于这一主题的好书,我相信它甚至可以合法地下载为pdf格式,谷歌会帮你做到这一点


    您的另一个问题是:您可以在sql外部处理组合的_family_age,如果经常需要该列,也可以使用视图处理组合的_family_age。但是,您不应该手动管理内容,让数据库为您计算。

    我在两个方面不同意nermalization示例

  • 最终没有cat实体。取而代之的是一种关系(猫名,猫名),在你的例子中,这种关系的直接后果是你无法判断有多少只猫叫劳拉。这是一个很容易避免的异常现象
  • 该表将两个关系塞入一个表中,分别与\u所有者和\u名称下的\u生活在一起。这不是一个好主意,尤其是如果数据是暂时的,因为它会产生各种令人讨厌的异常。相反,您应该为每个应用程序使用一个表
  • 我将按如下方式设计此数据库:

    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
    
    我会使用比年份更细粒度的日期类型(在nermalization示例中,将2002-2002作为一个范围可能会导致混乱的查询语法),这样您就可以查询
    从所有者选择cat\u id,其中'2000-06-02'介于valid\u from和valid\u to
    之间。 至于如何在一般情况下处理时态数据的问题:Richard Snodgrass()的《用SQL开发面向时间的数据库应用程序》(Developing Time-Oriented Database Applications in SQL)是一本关于这一主题的好书,我相信它甚至可以合法地下载为pdf格式,谷歌会帮你做到这一点


    您的另一个问题是:您可以在sql外部处理组合的_family_age,如果经常需要该列,也可以使用视图处理组合的_family_age。但是,您不应该手动管理内容,让数据库为您计算。

    Wallen,您的示例实际上与Nermalization示例完全相同。我只是从链接到的页面中选取了第三个表。问题的一个组成部分是:“如果我希望我的表更细粒度,那么使用什么好方法?”?“In-SQL”和“external”构成了一个矛盾修饰法。你能澄清一下吗?另外,谢谢你的推荐。我将从那里开始查找。另外,+1表示
    整数引用cat(id),
    。谢谢。视图也是用SQL编写的,所以我的意思是:您可以使用查询进行聚合,如
    select sum(age),family_name from person group by family_name
    ,或者您可以说
    create view family_age as select sum(age)age,通过family_name,您可以通过简单的
    选择年龄,family_name from family_ages
    查询这个问题。时间颗粒化实际上是一个有趣的设计问题,我真的必须让您参考Snodgrass进行深入讨论。有时您更喜欢使用时间戳,并使一个条目的有效_to等于下一个条目的有效_。有时,正如我在回答中所做的那样,您需要一个粒度(这里是一天),并且一个有效的_到+1等于下一个有效的_。这是一种在易于查询(使用select where-between非常方便)和易于定义(确保完整性所需的约束变得更加复杂)之间的折衷。这就是视图的本质:一个(虚拟)表,其列派生自其他表。你可以从视图中选择,就像从表中选择一样。沃伦,你的例子实际上与Nermalization的例子完全相同。我只是从链接到的页面中选取了第三个表。问题的一个组成部分是:“如果我希望我的表更细粒度,那么使用什么好方法?”?“In-SQL”和“external”构成了一个矛盾修饰法。你能澄清一下吗?另外,谢谢你的推荐。我将从那里开始查找。另外,+1表示
    整数引用cat(id),
    。谢谢。视图也是用SQL编写的,所以我的意思是:您可以进行聚合