首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >此关系是否需要多个关联表?

此关系是否需要多个关联表?
EN

Stack Overflow用户
提问于 2012-01-09 02:20:51
回答 2查看 306关注 0票数 0

我正在尝试找到最好的方法来构建一个将许多常量映射到许多项的关系。

我最初的关系,一个项目有一个常量,看起来是这样的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Constant(Base):
    __tablename__ = "Constant"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False)

class Item(Base):
    __tablename__ = "Item"
    id = Column(Integer, primary_key=True, autoincrement=True)
    constantId = Column(Integer, ForeignKey("Constant.id"))
    constant = relationship("Constant")

然而,我真的需要我的项目有一个以上的常量,就像这样…

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Item(Base):
    __tablename__ = "Item"
    id = Column(Integer, primary_key=True, autoincrement=True)
    constant1Id = Column(Integer, ForeignKey("Constant.id"))
    constant1 = relationship("Constant")
    constant2Id = Column(Integer, ForeignKey("Constant.id"))
    constant2 = relationship("Constant")

我的第一个尝试是使用关联表...

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
item_to_constant_assoc = Table("itemToConstantAssoc", Base.metadata, Column("constantId", Integer, ForeignKey("Constant.id"), Column("itemId", Integer, ForeignKey("Item.id")))

同时相应地更新Item类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Class Item(Base):
__tablename__ = "Item"
id = Column(Integer, primary_key=True, autoincrement=True)
constant1 = relationship("Constant", secondary=item_to_constant_assoc, uselist=False)
constant2 = relationship("Constant", secondary=item_to_constant_assoc, uselist=False)

这会失败(在查看创建的MySQL表时可以理解),因为Item.constant1和Item.constant2引用了关联表中的相同条目。

我的下一步是为第二个常量添加另一个关联表,但我不得不怀疑我是否创建了错误的树,因为我似乎正在为一个相对简单的映射创建大量的表。我已经看过文档了。它是详细和实质性的(感谢Michael Bayer!)我可能刚刚忽略了一个部分。有人能为我提供一些关于这个问题的建议,或者我应该在文档中寻找的东西吗?

谢谢!菲尔

EN

回答 2

Stack Overflow用户

发布于 2012-01-09 04:33:09

只见树木不见森林。这很容易通过在关系上使用primaryjoin参数来实现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Item(Base):
    __tablename__ = "Item"
    id = Column(Integer, primary_key=True, autoincrement=True)
    constant1Id = Column(Integer, ForeignKey("Constant.id"))
    constant1 = relationship("Constant", primaryjoin="Constant.id==Item.constant1Id")
    constant2Id = Column(Integer, ForeignKey("Constant.id"))
    constant2 = relationship("Constant", primaryjoin="Constant.id==Item.constant2Id")
票数 2
EN

Stack Overflow用户

发布于 2012-01-09 11:11:12

多对多关联已经允许每个项具有无限数量的常量。你不需要比这更多的东西作为你的两个基表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Constant(Base):
    __tablename__ = "Constant"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False)

class Item(Base):
    __tablename__ = "Item"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False)    

item_to_constant_assoc = Table("itemToConstantAssoc", Base.metadata, Column("constantId", Integer, ForeignKey("Constant.id"), Column("itemId", Integer, ForeignKey("Item.id")))

在这一点上,每个项目都有无限数量的常量。当您想要一个特定的常量时,您必须通过常量表中的名称属性来查询常量。您的关联表只是一个密钥对列表:(itemID,constantId)。

一个项目的所有常量的集合是一个包含三个表的连接,用于所有关联行,并与给定项目的匹配常量行连接。

常量的所有项的集合是针对所有关联行的三表连接,以及与给定常量的匹配项行的连接。

需要通过join检索项的特定常量。你可以把它想象成给定项目的所有常量的集合,其中项目和常量名称都是给定的。即使只检索了一行,SQL也涉及到联接。

我认为将常量与所有相关项相关联或将项与所有相关常量相关联的通用查询将如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  query(Item). join(item_to_constant_assoc.itemId==Item.itemId). join(item_to_constant_assoc.contantId==Constant.constantId
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8783282

复制
相关文章
CPS推广:为什么我的佣金还没有到账呢
CPS推广奖励的佣金,目前无法直接后台提现,需要在次月月结之后,由财务系统统一打款到银行,即推广者后台所填写的银行账号,一般上月佣金,次月月末到账,具体时间以银行到账为准。
腾讯云-推广奖励
2019/11/28
10.7K0
CPS推广:为什么我的佣金还没有到账呢
为什么我用了Redis之后,系统的性能却没有提升
很多时候,我们在面对一些热点数据的时候,通常会选择将热点数据放到redis中,以减少数据库的查询,减轻数据库的压力。但是如果我们使用redis的方式不对,那么可能导致系统的性能不升反降。
Java进阶之路
2022/08/03
1.9K0
为什么我用了Redis之后,系统的性能却没有提升
为什么我的HibernateDaoSupport没有注入SessionFactory
1.按理来说Spring应该会通过setSessionFactory方法将SessionFactory注入进来,可是并没有。
用户2032165
2019/04/09
3.1K0
为什么我的HibernateDaoSupport没有注入SessionFactory
我的MVP呢?
Ladies and gentelmen, welcome the MVP of NBA 16-2017 Season:...
奔跑的小鹿
2019/01/25
5470
我的MVP呢?
为什么 MyBatis 源码中,没有我那种 if···else
在MyBatis的两万多行的框架源码中,使用了大量的设计模式对工程架构中的复杂场景进行解耦,这些设计模式的巧妙使用是整个框架的精华。
搜云库技术团队
2023/10/21
1930
为什么 MyBatis 源码中,没有我那种 if···else
为什么 MyBatis 源码中,没有我那种 if···else
在MyBatis的两万多行的框架源码中,使用了大量的设计模式对工程架构中的复杂场景进行解耦,这些设计模式的巧妙使用是整个框架的精华。
一行Java
2023/09/19
2210
为什么 MyBatis 源码中,没有我那种 if···else
为何cytoscape总是说我没有java呢
因为最近自己购置了一个全新的Windows电脑,所以就系统性的配置了全部的生物信息学相关软件,当然是也包括cytoscape啦。但是遇到了报错,如下:
生信技能树
2020/07/30
2.3K0
为何cytoscape总是说我没有java呢
我在南极看雪景,你呢?
开个玩笑啦,其实我还是在炎炎夏日中顶着大太阳去上班的路上。只不过我用了一个神器修改了手机的定位,今天偷偷分享给你们。
永恒君
2023/09/02
2320
我在南极看雪景,你呢?
如何让 SwiftUI 的列表变得更加灵活
List 可能是 SwiftUI 附带的内置视图中最常用的一种,它使我们能够在任何 Apple 平台上呈现“类似于表格视图”的用户界面。今年,List 获得了许多非常重要的升级,使其更加灵活和易于定制。让我们看看都有哪些新功能。
Swift社区
2021/11/26
4.9K0
分库分表,我为什么要用Shardingsphere呢?
分库分表推荐Spring Cloud Alibaba+Seata+Shardingsphere
35岁程序员那些事
2022/09/23
1.5K0
电脑的 ip 是怎么来的呢?我又没有配置过
显然,这里有两种配置方式,一种是自动获取 ip 地址,一种是我们手动来设置,我相信大部分人都是通过自动获取的方式来得到 ip 的,那么问题来了,它是如何自动获得到的呢?
帅地
2019/06/06
1.3K0
电脑的 ip 是怎么来的呢?我又没有配置过
如何告诉手机我是“我”呢?
2013年,苹果机iphone5S让指纹识别在手机上普及,它告诉各大手机厂商,指纹可以这么玩。同样苹果它也让指纹识别从手机上消失。譬如,今年苹果就推出了支持面部识别的iPhone X,而这款产品不仅带来了黑科技,也让解锁技术得到进一步的变革。当然,更值得一提的是,iPhone X的面部识别技术现在也已成为Android手机厂商所追求的潮流风向。 那老派今天就跟大家讲讲身份识别的几大类型。 1.指纹识别 指纹识别即指通过比较不同指纹的细节特征点来进行鉴别。指纹识别技术涉及图像处理、模式识别、计算机视觉、数学形
企鹅号小编
2018/01/18
1.1K0
如何告诉手机我是“我”呢?
在没有DOM操作的日子里,我是怎么熬过来的(中)
前言 继上篇推送之后,在掘金、segmentfault、简书、博客园等平台上迅速收到了不俗的反馈,大部分网友都留言说感同身受,还有不少网友追问中篇何时更新。于是,闰土顺应呼声,在这个凛冽的寒冬早晨,将中篇热文滚烫呈上。 搬好小板凳,接下来,正文从这开始~ 在上篇的众多留言中,有位网友的评论比较具有代表性,摘出来供大家一阅: “ 同感啊楼主 比如做tab的时候,以前jq就是切换一下class,现在vue是切换数据,再根据数据显示class,这弯绕的啊 ” 当然,有评论就有回复,请看下面这位网友是怎么回复他的:
闰土大叔
2018/04/12
1.6K0
在没有DOM操作的日子里,我是怎么熬过来的(中)
为什么我的数据库应用程序这么慢?
当您的应用程序运行缓慢时,反射操作是指责数据库查询。 毫无疑问,一些更为奢侈的拖延可能会因为缺失的指数或不必要的锁定而被指责,但还有其他潜在恶作剧,包括网络和应用本身。 Dan Turner指出,你可以节省大量的时间和金钱,通过努力确定问题所在的位置,然后潜入细节。 低应用程序首先影响终端用户,但是整个团队很快就会感受到影响,包括DBA,Dev团队,网络管理员以及照管硬件的系统管理员。 有这么多人参与,每个人都有自己的看法,可能的原因,可能很难确定瓶颈在哪里。 一般来说,SQL Server应用程序的性能问
Woodson
2018/07/18
2.3K0
我在ThoughtWorks中的敏捷实践
E项目是一个在线的物资跟踪监控系统。由ThoughtWorks团队为客户提供的一套完善的软件交付服务。
袁慎建@ThoughtWorks
2018/09/29
2.1K0
我在ThoughtWorks中的敏捷实践
解惑 | 为什么我根据时间戳获得的offset为空呢?
最近有一个需求,要查询某一时间戳对应的offset值,于是就想到了使用 ./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --time <timestamp> ,但是我在测试的时候,发现有的时间戳会获取不到offset,是空。但是明明指定的时间戳有上报数据,肯定有对应的 offset 的。于是就谷歌,找到了这篇帖子:
create17
2020/09/24
2.8K0
为什么加了@Transactional注解,事务没有回滚?
在前天的《事务管理入门》一文发布之后,有读者联系说根据文章尝试,加了@Transactional注解之后,事务并没有回滚。经过一顿沟通排查之后,找到了原因,在此记录一下,给后面如果碰到类似问题的童鞋一个参考。
程序猿DD
2020/07/16
9360
React数组变化之后,视图没有更新
react数组变化之后,视图没有更新 数组保存在state中,修改数组之后视图没有更新 function updateData(data) { this.setState({ data: data }) } 上面代码是修改状态值的,这样设置会导致视图没有更新,修改为如下代码即可: function updateData(data) { this.setState({ data: [...data] }) }
寻找石头鱼
2020/06/05
2.9K0
在 SwiftUI 中创建一个环形 Slider
Slider 控件是一种允许用户从一系列值中选择一个值的 UI 控件。在 SwiftUI 中,它通常呈现为直线上的拇指选择器。有时将这种类型的选择器呈现为一个圆圈,拇指绕着圆周移动可能会更好。本文介绍如何在 SwiftUI 中定义一个环形的 Slider。
韦弦zhy
2023/01/06
3.7K0
在 SwiftUI 中创建一个环形 Slider
点击加载更多

相似问题

为什么我的Rails模型属性在我运行方法之后没有更新呢?

14

在我添加了FutureBuilder之后,ListView没有更新状态

212

为什么我的SwiftUI列表没有更新?

221

为什么我的ObservedObject应用程序中没有更新SwiftUI数组?

51

为什么我的下拉选项在我的Ajax调用之后在源代码中更新,而不是在UI中呢?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文