SQL规范化,3个固定值上的多对多?

标签 sql database-design

我试图理解多对多关系,但我的脑袋一直在为我的这个爱好项目而崩溃:

在游戏数据库中,我目前只有一个表来保存所有列和值。

GAMES
id   name   alt_name1   alt_name2   type                length    group_size
----------------------------------------------------------------------------
1    foo    foozoo      NULL        ice, team, silly    s, m      s, l, xl

但是,在实现搜索时,我在专门为小团体寻找中等长度愚蠢游戏时遇到了问题。。 p>

据我所知,为了规范化,我将为 name 创建一个新表(一个 id 最多三个名称)。 typelengthgroup_size 是多对多关系,所以我需要为它们的值创建表和一个表来保存它们与游戏的关系:

type
games_type
length
games_length
group_size
games_group_size

有没有比创建所有这些表更好的方法?

谢谢你的想法!

最佳答案

任何时候你有一个多对多的关系,你应该有 2 个包含不同值的表,然后是另一个将这两个关联的表(联结表)。

在包含非关联记录的表中,所有其他列都应描述主键独有的属性。如果一个描述值可以在一个表中出现多次,它应该有自己的表(查找表)。

例如:

Items_A
id,name

Items_B
id,name

A_with_B
item_a_id,item_b_id

这是用户和组的常见用法,如下所示:

Users
id,name

Groups
id,name

Group_Users
user_id,group_id

如果您扩展该示例以包含一个查找表,您可能会得到类似这样的东西(其中一个用户只能在一个位置,但可以属于多个组):

Users
id,name,location_id

Locations
id,name

Groups
id,name

Group_Users
user_id,group_id

关于SQL规范化,3个固定值上的多对多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14486588/

相关文章:

mysql - 如何在 Mysql 中更新或更改自动递增列值

sql - Oracle是否会因错误而回滚事务?

database-design - 数据库日期字段 - 命名约定

c# - 如何将 ASP.NET 成员/角色用户链接到数据库中的表?

php - 数据库结构 : Finding and marking similar entries

java - 当语法正确时,LIKE 在 MYSQL 中不起作用

sql - 检查 SQL 查询是否会返回结果的有效方法

mysql - 如何在单个查询中单独获取过去三个月的数据计数?

mysql - 数据库设计 : how to model a table?

sql-server - 如何将文本文件导入MSSQL