我将在设计数据库时对当前存在的情况进行评论。
我有下表:
user (id, name, lastname)
role (id, name)
user_role (user_id, role_id, from_date, to_date)
period (id, name, from_date, to_date)
期间表用作数据主数据,以了解我在应用程序中定义的期间的名称。
在这种情况下,我仅提及user
,role
和user_role
表,但还有许多带有句点的表。
周期表的目的是充当模型表中存在的不同周期的标签系统。该表没有任何外键与其他表相关联。为了进行搜索并使其他表与此相关,使用日期从和日期到进行连接。
例如,user_role
表的一个元组可以具有一个起始日期和一个截止日期,该日期可以覆盖期间表中定义的多个期间,因此将用其所包含的期间的名称进行标记。
period
表是不相关的表可以吗?它仅用于给句点起名字,这就是为什么我这样说。您能想到另一种更好的方法吗?周期表是否应该以其他方式与其他表相关?
提前感谢。
您正在使用数据仓库术语来确定时间维度。并且您不需要与其他表有关系。该表仅用于查找,并且可以基于日期间隔使用。
所以您有两种情况。
情况一,(外键)您确实引用了另一张表中的句点。假设表x通过period_id引用周期表。如果您需要为使用相同期间的许多行更新期间,则只需更新期间表中的一行。此解决方案的好处是,如果表x中有1000个行引用一个期间,则只需更新该期间,而不必更新1000行。同样,如果多个表中的多行引用相同的期间,则只需更新期间表中的一行。缺点是,如果您想要一个不同于现有期间的期间,则必须创建一个新期间并引用表x中的期间,而不是仅更新表x。
情况二,您将期间存储在表x中如果您不从表x引用周期表,则更容易自定义周期,只需更新表x即可,而不是更新周期表中的记录。
因此,如果您不在多行之间共享数据,则情况一的好处不存在,而情况二则更好。
period is与user_role有关,它们都具有彼此相关的from_date和to_date列。
它们没有外键关系,但是如果您要这样做,则可以将您的期间表绝对加入到user_role表中。
我不认为有更好的方法来设计它,因为您的时段是任意的,并且与user_roles有多对多的关系。
周期表可能是不相关的表的问题最终是一个业务问题,只能由您/您的业务需求来回答...;)如果例如您的用户角色是指一个或多个期间,则用户角色表中应该有一个FK,而不是开始日期和结束日期,或者如果是多对多,则应该是一个关系表。如果期间的定义遵循不同的逻辑,并且允许重叠的期间或从事件到日期/期间的异步分配,那么不相关就可以了。
表(基础,视图和查询结果)表示关系(船)/关联。 FK(外键)约束有时称为“关系(ship)”,但并非如此。它们是事实的陈述。他们说子行在其他地方显示为PK(主键)或UNIQUE;实体一次在其他地方参与。表的含义对于查询来说是必要且足够的。约束-包括PK,UNIQUE,NOT NULL,CHECK和FK-既不需要查询也不足以查询。它们是由DBMS强制执行的完整性。 (但是,当约束成立时,其他查询返回的结果与不假定约束的查询相同。)
[当它们拥有&时声明约束,而不是已经声明的约束所隐含,并且当它们不持有或者被已经声明的约束隐含时就不要声明它们。