首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DB设计-多个文本字段

DB设计-多个文本字段
EN

Stack Overflow用户
提问于 2011-11-13 00:28:23
回答 2查看 68关注 0票数 0

我有一张桌子,上面有几种语言的产品及其描述。目前,表结构如下所示

tblProducts

代码语言:javascript
运行
复制
productId INT PK AI
productDesc_en VARCHAR
productDesc_de VARCHAR
productDesc_it VARCHAR

诸若此类。en代表英语,de代表德语。

所以访问者根据他的语言设置,看到他的语言描述。

只是想知道,像这样存储数据有什么好处吗?

tblProducts

代码语言:javascript
运行
复制
productId INT PK AI

tblProductDesc_en

代码语言:javascript
运行
复制
descId INT PK AI
tblProducts_productId INT FK
description VARCHAR

tblProductDesc_de

代码语言:javascript
运行
复制
descId INT PK AI
tblProducts_productId INT FK
description VARCHAR

tblProductDesc_it

代码语言:javascript
运行
复制
descId INT PK AI
tblProducts_productId INT FK
description VARCHAR

我在这个解决方案中看到的专业人士:

  1. 从DB角度更容易维护
  2. 在从DB记录实例化对象时使用的内存较少(因为只有所需的语言将存储在对象中)

诈骗案:

performance;

  • More

  • 必须使用联接从类

中获取可能会击中复杂的getter和setter的所需数据。

还要别的吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-13 01:50:22

我认为,在添加新语言时,只有一个带有标记的额外表将是一个非常接近于规范化的好解决方案,提供了一个更坚实的db架构。

会是这样的:

代码语言:javascript
运行
复制
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。那么,如果一个产品存在,而不是一个描述,这意味着没有可用的描述。我认为,没有理由允许上面的零数字符号。

票数 2
EN

Stack Overflow用户

发布于 2011-11-13 00:38:26

当前情况下最大的缺点是需要添加一种语言。当前解决方案中的更改可能比将语言分离出来时更广泛、更脆弱。

有一个替代的解决方案,在您的两个建议之间的一半,它减少了您建议的解决方案的缺点的影响。这是将一种语言作为产品描述中的默认语言,并在单独的表中使用其他语言。这确实假定大多数用户将访问您的数据库一种语言。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8108655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档