您的报告(从某个日期开始)具有给定银行产品期限三元组的利率。因此,利率可能取决于其银行、产品和期限。您建议使用(忽略日期)(银行产品)-期限利率三元组的表格。这给出了一个取决于银行、产品和期限的利率。因此,您当前的设计通常是足够的。添加日期时仍然如此。
这正是最近的问题How can I make a schedule table for instructor from tables created 和How to join section table with ERDigram 中的问题。 (您甚至都有一份初始报告,其中包含来自网格中一个维度的条目,其中一个维度在顶部变化,来自多个其他维度的子行在行中变化,一个维度实际上不在报告中。)
最好在数据库之外的业务中使用永久唯一标识符。但是您的 代码 似乎可以做到这一点。 terms 由它们的天数标识。银行产品代码对标识银行产品对。所以不清楚为什么/你需要 any ids:
Bank(code, name) -- PK (code)
Product(code, name) -- PK (code)
Bank_Product(bank_code, product_code)
-- PK (bank_code, product_code)
-- FK (bank_code) references Bank (code)
-- FK (product_code) references Product (code)
Rate(bank_code, product_code, term, date, rate)
-PK (bank_code, product_code, term, date, rate)
-FK (bank_code, product_code) references Bank_Product
(如果术语不只是 Rate 中的术语,那么您还需要 Term(term) -- PK (term) 和 Rate 中的 FK (term) references Term。)
PS:有一个有趣的约束表格代表像您这样的报告,如果(与您的示例报告一致)它有一个来自一个维度的网格条目,用于(子行) 来自其他一些维度的值。约束是在所有其他维度上投影表会连接贡献这些值的表。