mysql - 在 MySQL 表中拆分数据的好处

标签 mysql sql optimization

我曾参与过一个项目,该项目有一个类似这样的表格:

tbl_texts
id, item_id, item, type, lang, value
1, 44, 'product', 'name', 'en', 'Product Name'
2, 44, 'product', 'description', 'en', 'Product description'
3, 55, 'category', 'name', 'en', 'Category name'
4, 55, 'category', 'name', 'fi', 'Category finnish name'

在 6 个字段中,1 个是主键,4 个是组合索引。从未使用主键选择数据。始终使用 Item_id、item、type、lang 索引。

1)我想知道这是存储数据的好方法还是坏方法?

2)有一个必须连接两次的表是不是不好的设计(如果您想要产品的名称和描述)。

3)我应该将数据分成这样的表:

tbl_product_texts
id, product_id, type, lang, value

tbl_category_texts

(etc.)

4)或者像这样:

tbl_product_names
id, product_id, lang, name

tbl_product_descriptions
id, product_id, lang, description

(etc.)

5)或者甚至像这样:

tbl_product_names_en
id, product_id, name

tbl_product_descriptions_en
id, product_id, description

(etc.)

我真的很困惑哪种方法是最好的。

最佳答案

存储数据的“最佳”方式是一个非常开放式的问题。在设计数据存储架构时,您需要考虑多个方面:

  • 您的数据是如何被访问的? (查询优化)
  • 您的数据是如何创建的?
  • 您的数据库架构将来发生变化的可能性有多大?

维基百科有一篇关于数据标准化的好文章:http://en.wikipedia.org/wiki/Database_normalization

我个人会根据基础数据创建有意义的表。如果产品与类别足够不同,那么我会将它们存储在不同的表中。虽然您只提供了一小部分数据样本,但我将假设每个产品都有多个名称和描述,但每种语言只有一个条目。这样你就会得到以下内容:

Products:
  PK: id
  ...other columns that each product only has a single value for (price for example)

Product_Texts:
  PK,FK: product_id 
  PK:    language
         name
         description

(PK - 主键,FK - 外键)

如果您有搜索名称或描述的查询,则可以考虑根据需要在这些字段上添加更多键。

关于mysql - 在 MySQL 表中拆分数据的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19709280/

相关文章:

php - Mysql数据仅将最后结果拉入Json数组

python - Pandas 加入具有不同名称的列

mysql - 遍历mysql中字符串中的字符

sql - 数据库设计-如何在同一个表中拥有主键的外键?

java - 如何在java中重构、修复和优化这个字符替换功能

c++ - 是什么导致我的循环在其第一次迭代中运行得更慢?

javascript - PHP、Javascript 获取mysql数据并在javascript中进行计算

mysql - 检查 mySQL 中相邻列的值

php MYSQL 查询问题

sql - 为所有表设置 IDENTITY_INSERT OFF