【问题标题】:Implementing many to many relation in mysql在mysql中实现多对多关系
【发布时间】:2016-10-19 19:41:35
【问题描述】:

我有两张桌子

1.矩形(rectId , xPos , yPos , height , width)

2.比例(scaleId , someothercols...)

现在矩形中的每一列都可以有 '0 到 1' 的比例。

即 xPos 可以有刻度,yPos 可以有刻度等等。所以一般来说,一个矩形可以有多个比例。

此外,上述所有列也可以没有比例参考,在这种情况下,它们将具有静态值,即 xPos=50,yPos=60 等等..

此外,一个比例尺可以被多个矩形引用。

在sql中实现这个的最好方法是什么

我想到的方法是有一个带有 rect_column 属性 exg 的连接表 Rectangle_scale :

Rectangle_scale

| rectScaleId | rectId      | scaleId      | rect_col(string)|
|:----------- |------------:|:------------:|---------------- | 
| 1           |      1      |     2        |  Xpos           |
| 2           |      1      |     3        |  Ypos           | 
| 3           |      2      |     2        |  Height         | 

这是正确的方法吗?我还需要 rectScaleId col 还是应该使用 rectId 和 scaleId 作为复合主键

另外,提一下与问题没有直接关系的东西,我用的是Laravel 5.2框架和eloquent,不是必须的,但是坚持Laravel eloquent限制的解决方案会很好。

【问题讨论】:

  • 我认为你这里的设置很好。我也喜欢在每个表中都有一个 ID 列。从技术上讲,您不必在 rectangle_scale 中有一个,但我认为它可以更轻松地从该表中更新/删除记录。
  • 那是一个不错的选择我也建议你使用coupe引用的矩形id和引用的比例id作为连接表的主键,有rectScaleId列是多余的,考虑每一个可能的选择即使一个矩形必须有多个比例,两个 id 的并集总是唯一的。

标签: mysql laravel-5 eloquent


【解决方案1】:

如您所说,实现多对多关系需要一个连接表。

所以根据你的问题,关系基本上是rectange 表和scale 表之间的关系。

我们需要表格具有的属性:

  • 每个比例都可以引用任意现有矩形所需要的数量
  • 每个矩形都可以关联与多个比例

这可以通过如下创建表来完成:

create table rectangle (
  rectID int primary key auto_increment,
  xPos int,
  yPos int, 
  height int,
  width int)ENGINE = Innodb;

create table scale (
  scaleID int primary key auto_increment,
  descr text )ENGINE = Innodb;

create table rect_scale (
  scale int not null,
  rect int ,
  rect_col varchar(100),
  primary key (scale,rect),
  foreign key(scale) references scale(scaleID),
  foreign key(rect) references rectangle(rectID)     
)ENGINE = Innodb;

我还在 SQLFiddle 上创建了一个演示:here

【讨论】:

  • 我这样做了,但后来我又放弃了多对多行的想法,因为我正在研究的框架使处理这样的关系变得困难
  • 你必须创建表和模型之间的映射
  • Laravel 5.2,据我所知它不支持复合 PK,也不确定如何使用 laravel 实现第三列,即 rect_col 对许多关系模型实现
【解决方案2】:

您不需要中间表,您的 xPos 和 yPos 可以是比例表的外键,如下所示:

CONSTRAINT xpos_scale_fk FOREIGN KEY(xpos) REFERENCES scale(scaleId) 
CONSTRAINT ypos_scale_fk FOREIGN KEY(ypos) REFERENCES scale(scaleId) 

但您需要在这种情况下在比例表中创建记录:

此外,上述所有列也可以没有比例参考,在这种情况下,它们将具有静态值,即 xPos=50,yPos=60 等等..

我不完全了解您在比例表中的值,但我会将您的数据标准化,以便 xpos 和 ypos 始终具有相同类型的数据——对比例的引用。这样您就可以避免再设置一个中间表进行更复杂的设置。

所以它看起来像这样(如果我正确理解你的问题):

rectangle
rect_id, xpos, ypos, height, width
1, 0, 1, 2, 2

scale
scale_id, units, values
0, pixels, 50
1, pixels, 100
2, meters, 2

那么下一步可能是将比例分解为单位和值。

【讨论】:

  • 感谢您的回答,但如果我这样做,我将如何处理上述情况,即没有比例参考但静态值,
  • 我想我会将它们添加到 scales 表中。
  • 但是比例表本身可以被多个矩形引用
  • 您的设置也是有效的,但有点复杂。因为你在 scaleId 和 rectCol 上都有关系。
  • 如果矩形表有 2 个外键(xpos 和 ypos)来缩放表也没关系。一个比例可以被多个矩形引用,外键不必是唯一的。
猜你喜欢
  • 2016-08-08
  • 1970-01-01
  • 2012-06-05
  • 2018-11-29
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多