我有两张桌子
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框架,并且不一定需要雄辩,但是坚持Laravel雄辩的限制的解决方案会很好。< / p>
答案 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
然后,下一步可能是将比例分解为单位和值。