Country table
country_id,country_name
State table
state_id,state_name,state_country_id
City table
city_id,city_name,city_state_id
Product table
product_id,product_name,product_city_id
以上设计好吗?如果我想检索产品国家/地区ID,则必须编写子查询或内部联接。
还是可以如下修改产品表?
Product table
product_id,product_name,product_city_id,product_state_id,product_country_id
您的建议违反了3NF(假设您的候选密钥很明显)。3NF声明(根据Wikipedias的定义,http://en.wikipedia.org/wiki/Normal_forms#Normal_forms):
“每个非主键属性都非传递性地依赖于表中的每个候选键。从表中删除对主键的描述无用的属性。换句话说,不允许传递性依赖。”
在您建议的修改中,product_id是候选键,但是product_country_id是可传递地依赖于product_id
就是说,在某些情况下,出于实际原因,您可能选择违反常规格式,但是您应该意识到自己正在这样做,并采取额外的预防措施以防止更新异常。
旁注:IMO最好使用诸如country_code之类的标准标识符代替country_id,请参见ISO 3166(http://en.wikipedia.org/wiki/ISO_3166-1_alpha-3)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句