mysql - 如何设计数据库来处理与单个主键相关的列中的多个值?

标签 mysql sql database

假设有表 Oil_man :

Oil_man_ID  Component_A    Component_B        Raw_Data
 645463         87            13         76,87,837,87272
 844887         76            24         87,3938,39383,837383,3838,9,383,8378,14263,27263
 764767         60            40         8487,8478

现在,如果我想打印特定 ID 的 Raw_data 中的所有值,我必须进行一些肮脏的修改,当 Raw_Data 中的值数量开始快速增加时,这会非常令人困惑。 Raw_data 中的值是随机的,除了长度方向外没有任何限制。

在这种情况下我应该如何正确设计数据库? Raw_Data 中的值应该正确链接到 Oil_Man_Id 。谢谢您

最佳答案

对于重复属性,规范模式是一个单独的表,具有对父表的外键引用。例如:

parent_table
oil_man_id  component_a  component_b 
----------  -----------  -----------
    645463         87             13 
    844887         76             24 

child_table
oil_man_id  attribute
----------  ---------
    645463         76 
    645463         87 
    645463        837 
    645463      87272
    844887         87
    844887       3938

为了避免“重复”,请在 FK 和属性列的组合上创建唯一索引。它可以作为表的主键。 (是否允许重复由您决定;在任何一种情况下都可以添加代理主键。)

如果属性的顺序很重要,您还可以添加其他属性,例如序数位置(序列)。

如果我们希望能够将 Raw_Data 中的值作为一个集合来处理,那么这是我们应该遵循的正常模式。重复属性表的示例定义,对属性值具有 UNIQUE 约束:

CREATE TABLE child_table
( oil_man_id       INT UNSIGNED COMMENT 'PK, FK ref parent_table.id'
, attribute        INT UNSIGNED COMMENT 'PK'
, ordinal_position INT UNSIGNED COMMENT '1,2,3,...'
, PRIMARY KEY (oil_man_id, attribute)
, CONSTRAINT FK_child_table_parent_table FOREIGN KEY (oil_man_id)
  REFERENCES parent_table (oil_man_id)
  ON DELETE CASCADE ON UPDATE CASCADE
) Engine=InnoDB;
<小时/>

如果MySQL永远不需要将Raw_Data的各个组件作为一个集合来处理;无需查询 Raw_Data 中是否存在单个值,也无需添加或删除单个值,或将单个值作为单独的行返回...如果 MySQL 将将此视为一个长的匿名字符串,您可以使用 VARCHAR 列将其存储为字符串。或者,如果它是一个非常长的字符串(并且行大小将超过支持的最大行大小),您可以使用 TEXT 数据类型。

关于mysql - 如何设计数据库来处理与单个主键相关的列中的多个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23415301/

相关文章:

database - LinkedIn 是通过什么机制在群组页面上如此快速地告知属于该群组的用户的联系?

database - 如何在没有空列/单元格的情况下实现 Twitter 推文、回复和转发数据库架构

java - 在 Java 中导入 CSV 文件

php - 在 select 子句中重用 Doctrine 别名

java - 使用java和mysql服务器的读/写模式

javascript - echo onClick 后删除 sql 行

php - MySQL如何根据连接表的用户输入进行排序?

sql - 对表进行重复数据删除的最佳方法是什么?

mysql - MYSQL 错误 1193--在同一个表上更新

php - 子表中的外键如何自动获取其在父表中的实际值