在mysql中实现多对多的关系

时间:2016-10-19 19:41:36

标签: mysql laravel-5 eloquent

我有两张桌子

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

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

现在,矩形中的每一列都可以包含' 0到1'与之相关的规模。

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

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

也可以通过多个矩形引用比例。

在sql

中实现此功能的最佳方法是什么?

我想到的方法是使用带有rect_column属性e​​xg的联结表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框架,并且不一定需要雄辩,但是坚持Laravel雄辩的限制的解决方案会很好。< / p>

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您不需要中间表,您的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

然后,下一步可能是将比例分解为单位和值。