我有一张桌子,上面有几种语言的产品及其描述。目前,表结构如下所示
tblProducts
productId INT PK AI
productDesc_en VARCHAR
productDesc_de VARCHAR
productDesc_it VARCHAR
诸若此类。en代表英语,de代表德语。
所以访问者根据他的语言设置,看到他的语言描述。
只是想知道,像这样存储数据有什么好处吗?
tblProducts
productId INT PK AI
tblProductDesc_en
descId INT PK AI
tblProducts_productId INT FK
description VARCHAR
tblProductDesc_de
descId INT PK AI
tblProducts_productId INT FK
description VARCHAR
tblProductDesc_it
descId INT PK AI
tblProducts_productId INT FK
description VARCHAR
我在这个解决方案中看到的专业人士:
诈骗案:
performance;
中获取可能会击中复杂的getter和setter的所需数据。
还要别的吗?
谢谢!
发布于 2011-11-13 01:50:22
我认为,在添加新语言时,只有一个带有标记的额外表将是一个非常接近于规范化的好解决方案,提供了一个更坚实的db架构。
会是这样的:
CREATE TABLE `language` (
`prodID` INT UNSIGNED NOT NULL ,
`desc` varchar(30) null ,
`lang` char(2) NOT NULL,
PRIMARY KEY (`prodID`,`lang`),
CONSTRAINT `fk0` FOREIGN KEY (`prodID`)
REFERENCES `product` (`prodID`)
ON DELETE CASCADE
) ENGINE=InnoDB ROW_FORMAT=COMPACT;
外键将提供完整性时,产品被删除,也允许插入时,只有产品存在。
复合主键将使(语言和产品)的描述只存储一次。
在依赖性方面,这个主键在我看来不错,回顾一下关于db的讲座,它是好的,因为非主键字段依赖于主键的两个部分,我的意思是需要识别这两个部分。
您有相同的字段作为主键和外键的一部分,这就像借用主键的这一部分一样。
==========编辑1(上面没有任何变化) ============== I将在desc字段上用Not Null
代替Null
。那么,如果一个产品存在,而不是一个描述,这意味着没有可用的描述。我认为,没有理由允许上面的零数字符号。
发布于 2011-11-13 00:38:26
当前情况下最大的缺点是需要添加一种语言。当前解决方案中的更改可能比将语言分离出来时更广泛、更脆弱。
有一个替代的解决方案,在您的两个建议之间的一半,它减少了您建议的解决方案的缺点的影响。这是将一种语言作为产品描述中的默认语言,并在单独的表中使用其他语言。这确实假定大多数用户将访问您的数据库一种语言。
https://stackoverflow.com/questions/8108655
复制相似问题