php - 设计彼此相关的mysql表的最佳方法是什么?

标签 php mysql

我有 2 个 Mysql 表,如下所示:

用户:

uid    uname    pass   email    st_id
================================================
1      xxx      xx     xx       1, 2,3, 4

车站:

st_id  st_name
================
1      xxx    
2      xxx    
3      xxx    
4      xxx    

当我添加新用户时,我需要选择多个站s,并且将 st_id 作为逗号 (,) 分隔值插入到 users表。

这样插入st_id是不是更好?

我可以将每个不同的st_id插入到users表中,然后在users表中总行将为4。如下所示:

用户:

uid    uname    pass   email    st_id
================================================
1      xxx      xx     xx       1
1      xxx      xx     xx       2
1      xxx      xx     xx       3
1      xxx      xx     xx       4

但是这样冗余数据就会太多!

哪种数据库表设计最好,为什么?

最佳答案

您想要第三张 table !

create table UserStations (
    UserStationId int auto_increment,
    UserId int not null,
    StationId int not null,
    primary key (UserStationId),
    unique (UserId, StationId),  -- probably intended
    constraint fk_userstations_user foreign key (UserId) references users(uid),
    constraint fk_userstatsion_station foreign key (StationId) references stations(st_id)
);

这称为连接表。这是在关系数据库中表示多对多关系的正确方法。

错误的方法是使用分隔的 ID 列表。为什么?

  • 应使用适当的类型存储值。您将数字存储为整数。
  • 列应包含单个值,而不是列表。
  • 应显式声明外键关系。
  • SQL 对字符串类型的支持不强。
  • 对字段的查询无法利用索引。
  • 字符串中的值列表很难保持唯一性。

关于php - 设计彼此相关的mysql表的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40960784/

相关文章:

php - 我该如何优化这个简单的脚本?

php - 如何使用数据库中存在的文件进行压缩下载?

php - 如何防止事务中的 MySQL 竞争条件重复条目

javascript - 中止所有异步请求

php - MySQL Event与Table的连接

php - 无法在单个产品页面中重新排序产品标签?

php - 执行类别搜索 Sphinx php

javascript - 添加两个 MySql 变量在一起,一个日期和一个数字与 php

java - 我需要用Java在mysql中创建新数据库

mysql - 如何在expect/TCL脚本中从转储文件创建MySQL数据库?