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示例
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示例
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编写的,所以我的意思是:您可以进行聚合