假设您有以下表格:订单,客户,活动,行和 LineAssignments 即可。我可以修改的唯一表是LineAssignments表。
不同的页面显示不同的信息组合与线路分配。例如,在某些页面上,我只显示带有行分配的事件信息,而在其他页面上,我用它们显示订单信息等。
基本上,每当我添加新的行分配时,我是否也应该存储 EventID , CustomerID 和 OrderID ,或者我应该只存储 OrderID ,然后执行多个连接以获取其他数据。创建一个连接这些表的视图会更好吗?
答案 0 :(得分:1)
我倾向于遵循思想流派,数据只应在数据库中表示一次。这意味着,在您的位置,我会尝试从多个连接中获取我需要的东西,并且只存储OrderID。
我这样做的原因是,如果存储在其他表中的数据(您复制到LineAssignments表中的数据)有可能被更新,则复制的数据将是错误的。我不认为其他表中的数据会发生变化的可能性很大,但是它很可能会发生变化......你最好使用连接而不是可能不正确的数据。
答案 1 :(得分:1)
这只是一个表现问题。通常,您应该坚持3NF,即没有冗余。虽然这提供了非常紧凑和优雅的数据结构,但它也可能导致严重的性能问题。
如果您的数据库既是生产性数据又是历史数据,即通过时间增长,通常会出现这种情况。
发出联接查询时,您的RDBMS会将尽可能多的信息加载到内存中,通常是索引信息以加快查询速度。现在,如果你的索引太大而不适合内存,那么你的RDBMS(不,操作系统)将不得不交换,这是一个性能杀手。
真正的交易(在我看来)是将生产数据(例如开放/未付订单)与历史数据完全分开。历史数据可以并且应该进行优化以便快速检索,因为没有任何变化,硬盘便宜。
生产性数据应该很好而且紧凑(3.NF)。每当一条信息不再生产(订单付款,零件交付等)时,它将从生产数据库中删除并转移到历史数据中。
获取有关“数据仓库”主题的信息,以防您不熟悉并阅读有关概念的信息。这很容易理解。