首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

M:N是OOP中的一种糟糕的风格吗?有没有更好的管理m:n关系的方法?

M:N是OOP中的一种糟糕的风格吗?

M:N是指多对多关系,它在对象导向编程(OOP)中是一种常见的关系模型。在M:N关系中,一个对象可以与多个其他对象相关联,同时一个对象也可以被多个其他对象关联。这种关系模型在实际开发中经常出现,例如学生和课程之间的关系,一个学生可以选择多门课程,而一门课程也可以有多个学生选修。

并不是说M:N关系是一种糟糕的风格,它是一种常见的关系模型,可以很好地描述实际世界中的复杂关系。然而,在某些情况下,M:N关系可能会导致数据冗余、查询复杂度增加等问题,需要采取适当的方法进行管理。

有没有更好的管理M:N关系的方法?

在管理M:N关系时,可以考虑以下几种方法:

  1. 使用关联表:创建一个关联表来存储M:N关系的相关信息。关联表包含两个外键,分别指向两个相关的实体表。通过在关联表中插入记录来建立关系,通过删除关联表中的记录来解除关系。这种方法可以很好地管理M:N关系,同时避免了数据冗余和查询复杂度增加的问题。
  2. 使用中间实体:在M:N关系中引入一个中间实体,将M:N关系拆分为两个一对多关系。每个一对多关系都可以使用外键来管理关系。这种方法可以更好地描述M:N关系的特性,同时也可以简化查询和数据操作。
  3. 使用ORM框架:ORM(对象关系映射)框架可以将对象模型和关系模型进行映射,提供了方便的操作接口和查询语言。通过使用ORM框架,可以简化M:N关系的管理,减少手动编写SQL语句的工作量。
  4. 使用图数据库:图数据库是一种专门用于管理图结构数据的数据库。对于M:N关系,图数据库可以提供高效的查询和遍历功能,更好地支持复杂关系的管理。

综上所述,M:N关系并不是一种糟糕的风格,但在实际开发中需要注意合理管理。使用关联表、中间实体、ORM框架或图数据库等方法可以更好地管理M:N关系,提高系统的性能和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

根据N种规格中的M种规格值生成的全部规格组合的一种算法

近来在开发SKU模块的时候,遇到这样一个需求,某种商品有N(用未知数N来表示是因为规格的数组由用户制定且随时可以编辑的,所以对程序来说,它是一个未知数)类规格,每一类规格又有M个规格值,各种规格值的组合便是一个型号...,比如说,颜色是商品规格的一类,可能的值有红、黄、绿、蓝,而尺码是另一类规格,可能的取值有L、M。...这类问题首先考虑的方法是用递归,但返回之间并没有相互依赖的关系,到底什么时候结束是个问题,用嵌套的循环又会由于数组的维度及深度不得而知而变得困难重重,后来,想到了一种很可能并非性能最优,但简单直观的方法...刚开始的时候想到要从多个数组中依次抽取一个元素出来,感觉去进行深度遍历相当复杂,后来换了一种思路,其实每次只要把两个数组合并起来,然后把这两个数组合并的结果再与下个数组进行合并,最终,就能得出逐个抽取一个元素来进行组合的结果...if(newTempGroup.length > 0){ tempGroup = newTempGroup; } } return tempGroup; } 其中generateTrRow方法是我生成表格中的行用到的

87610
  • CPU Cache简介

    N-way则是一种行和列的二维设计,提高了灵活性,在遍历和减少Hash冲突之间的互相平衡。 ?...三级缓存 我们的设计中,有三级缓存C1~C3的层级关系,对应到代码中,三者的实现原理都一样,都可以通过templateclass实现,无非是N-way和CacheSize的不同而已。...但我们还需要一个CacheManager来管理三个缓存以及内存之间的关系。...记得当年刚毕业时做的面试题,其中一个是遍历二维数组A[M][N],for(M) { for(N)}和for(N){ for(M)}之间有什么区别。...总结 CPU Cache的介绍就到此结束,希望大家在编码时,能留意让自己的代码更好的发挥缓存的优势。能够认识到OOP编程下,看似整洁的代码下,也夹杂着看不见的性能的牺牲。

    1K20

    一气之下,我一行代码搞定了约瑟夫环问题,面试官懵了

    不过,作为一个有着几十场面试经验的 xxx,我决定假装用最土的方法入手,等面试官问我还有没有其他方法时,我在一步步用更加牛逼的方法。 所以,第一种方法就是数组。...然后就按照这种方法,不停着遍历数组,不停着做标记,直到数组中只有一个元素是非 -1 的,这样,剩下的那个元素就是我们要找的元素了。我演示一下吧: 这种方法简单吗?...这种做法的时间复杂度是 O(n * m), 空间复杂度是 O(n); 面试官:还有其他方法吗?...和第一种方便相比,时间复杂度和空间复杂度都差不多,不过采用链表比较不容易出错。 面试官:还有更好的方法吗? 我:卧槽,链表这么好的方法还问我有没有更好的?好家伙,嫌弃代码太长没耐心看?...方法三:递归 帅地被迫只能拿出我的递归大法,递归是思路是每次我们删除了某一个士兵之后,我们就对这些士兵重新编号,然后我们的难点就是找出删除前和删除后士兵编号的映射关系。

    38530

    UVM方法学与设计模式_5:命令模式 & UVM Sequence

    更加糟糕的是,如果我们希望对命令进行更精细的控制,比如我们希望有相关的使能信号可以开关相关的命令,则代码将会演化成如下的糟糕状态: class Invoker { public: void run...到这里,仔细的同学估计已经想到了,套用之前几篇文章的套路,还是使用多态来进行代码改造(所以说多态才是OOP的根本,只不过C++和SV的多态都借用了继承的方式而已)。...(示例代码中是逐一调用AddCmd方法,有没有更好的方法呢?)。...本质上发给DUT的激励就可以看成是一个个具体的命令,在UVM中,这些激励被称为transaction。...transaction往往包装在sequence中进行后续的发射操作,UVM中可以对sequence及其中的transaction进行管理,其中包括设置优先级(uvm_do_pri)、同步操作等。

    58230

    Python 全栈 191 问(附答案)

    (1) 是元组吗?(1,) 是什么类型? 元组能增删元素吗? 怎么判断 list 内有无重复元素? 列表如何反转? 如何找出列表中的所有重复元素? 如何使用列表创建出斐波那契数列?...说说你知道的创建字典的几种方法? 字典视图是什么? 所有对象都能作为字典的键吗? 集合内的元素可以为任意类型吗? 什么是可哈希类型?举几个例子 求集合的并集、差集、交集、子集的方法?...对象的类型是? 如何格式化时间字符串?'2020-02-22 11:19:19' 对应的时间格式串是 '%Y-%M-%d %H:%m:%S' ,正确吗? 列举 datetime 模块中的四个类?...OOP 编程,对象的中括号访问机制,怎么实现的?...换位思考,日志管理模块设计者会考虑哪些日志管理问题? 作为程序员,使用什么工具和方法绘制出框架目录结构图?

    4.2K20

    面向对象编程是否走向了消亡?

    而论 OOP 在各个领域中的应用时,其是否真的有想象中那么糟糕?接下来,本文将带领大家一读 OOP 的兴衰成长史。 ?...内部逻辑与外部逻辑 严格的OOP风格的一个原则是,永远不可能从外部改变对象的内部状态。任何改变对象状态的业务或应用程序逻辑都必须作为对象本身的方法实现。...但是这很容易过火,特别是正在进行的操作处理的是不同对象之间的复杂关系时。 有时候,如果算法独立于任何对象之外,反而更好。这真的是一个重要的问题:对于这个问题集,你更关心名词还是动词?...与OOP一样,函数式编程不仅仅是单纯的一件事物,而是一套整体的风格上的原则。然而,它的要点是,虽然OOP专注于与对象进行交互或通信,但在FP中,重点在于对它们的转换。...在我自己的编程过程中,我更喜欢“混合”方法,在某些地方使用FP技术,而在其他地方使用OOP技术。在解决某些问题上FP确实能大放异彩,但也有另一些问题上OOP是更明智的选择。

    70430

    FW:面向方面开发

    AOP能够比上述方法更好地分离系统关注点,从而提供模块化的横切关注点。 在这篇文章里,我首先会解释横切关注点在软件系统中引起的问题,接着我会介绍AOP是怎样解决横切关注点问题的。...,把对应需求的实现强行限制在一维的空间里.这个一维空间就是核心模块级实现.其他需求的实现被嵌入在这个占统治地位的空间.换句话说,需求空间是一个n维空间,而实现空间是一维空间,这种不匹配导致了糟糕的需求到实现的映射...B e a n与数据库的映射,但是大多数情况下,开发者还是要了解存储结构。这种方式下,你用基于XML的映射关系描述器来实现于数据持久化相关的横切关注点。...研究人员已经尝试了多种方法来实现这个任务,这些方法有一个共同的主题:分离关注点。A O P是这些方法中的一种,它的目的是清晰的分离关注点来解决以上提到的问题。...我需要AOP吗? AOP仅仅是解决设计上的缺点吗?在AOP里,每个关注点的实现的并不知道是否有其它关注点关注它,这是AOP和OOP的主要区别。

    65320

    DiffPoseTalk:利用扩散模型进行语音驱动的风格化 3D 面部动画和头部姿势生成

    然而,现有方法要么使用确定性模型进行从语音到运动的映射,要么使用一种独热编码方案来编码风格。独热编码方法无法捕捉风格的复杂性,从而限制了泛化能力。...大量实验证明,我们的方法优于现有的最先进方法。 引言 语音驱动的3D面部动画从任意语音信号生成与嘴唇同步的面部表情,需要学习语音、风格和相应的面部运动之间的多对多映射关系。...图 1 我们的贡献总结如下: 我们提出了一种基于扩散模型的方法,用于生成来自语音的多样化和富有风格的3D面部动作和头部姿势,充分捕捉了语音、风格和动作之间的多对多映射关系。...鉴于描述演讲风格的复杂性和难度,我们选择通过对比学习的隐式学习方法。我们基于这样一种假设,即同一个人在两个接近的时间点的短期演讲风格应该是相似的。...借助扩散模型和说话风格编码器的强大功能,我们的方法在捕捉语音、风格和动作之间的多对多关系方面表现出色。

    1.1K40

    关系数据库如何工作

    这将花费您 N 次操作(N 是行数),这还不错,但有没有更快的方法?这就是树木发挥作用的地方。注意:大多数现代数据库都提供高级数组来有效地存储表,例如堆组织表或索引组织表。...我们在第一部分已经看到,范围查询的时间成本类似于 log(N) +M,其中 N 是该索引中的数据数,M 是对该范围内行数的估计。...请记住,真正的优化器通过统计信息知道 N 和 M 的值。注:N 和 M 是关系的基数。嵌套循环连接嵌套循环连接是最简单的一种。...图片这是想法:对于外部关系中的每一行您查看内部关系中的所有行以查看是否有匹配的行这是一个伪代码:由于是双迭代,所以时间复杂度为 O(N*M)在磁盘 I/O 方面,对于外部关系中的 N 行中的每一行,内部循环需要从内部关系中读取...该算法需要从磁盘读取 N + N*M 行。但是,如果内部关系足够小,您可以将关系放入内存中,然后读取 M +N。通过这种修改,内部关系必须是最小的,因为它有更多的机会适合内存。

    91120

    logic jerry_play 这个数组你会玩吗?

    “数组遍历顺序和中国古代的丞相有什么关系?” 来源| 杰瑞IC验证(ID:Jerry_IC) |原创 作者| Jerry Ren Jerry问大家,SystemVerilog中的数组会玩吗?...有没有小小的晕晕乎乎? 有人又说了,这个数组现实中谁会这么用?没用过这么多维的! 这个理由不错,但是这个复杂的梳理不清楚,你就敢保证简单的数组能理解的很清晰吗?...][k][l][m][n] = 1; end 对于初学者中的初学者,Jerry还是要提醒一句,请注意这个写法的细节: foreach括号里面jerry_play[i,j,k,l,m,n]中间的循环因子是逗号隔开这样列出来的哦...注意绝对不能写成这样: foreach(jerry_play[i][j][k][l][m][n])❌ 而里面用的时候是这样写: jerry_play[i][j][k][l][m][n] = 1; 里面的...帮你记住它是Jerry的义务: 一种方法呢就是可以尝试理解下为什么是这个顺序,这个原因其实是和SystemVerilog的仿真器存储数组元素的方式有点关系。先走非合并数组的维度、再走合并数组的维度。

    58320

    破坏开发人员生产力的十二件事

    例如,在一天的开始或午餐前举行简短的状态会议,以避免不必要的中断。 2. 微观管理 在不同类型的管理者中,微观管理者在开发人员的生产力方面可能是最糟糕的。...如果不知道什么是微观管理(micro-management)的,看下面的解释: 在商业管理中,微观管理(英语:Micromanagement),亦作微观管理学、微管理学、微管理或显微管理学,一种管理风格...海鸥管理 你听说过吗?当管理者完全没有参与工作时,就会发生这种情况,但是……他们偶尔会突然畏缩不前。“这是错的,这个,这看起来很糟糕,”等等,然后又飞走了。...范围变动 项目管理中的范围变动(也称为焦点变动,需求变动,特征变动)是指项目范围内的不受控制的变化。当项目范围未正确定义,记录或控制时,可能会发生这种情况。...t ) { r = 0.5 * ( r + (n/r) ); // Set r to half of r + (n/r) } 原文里就是这样,没看懂啥意思 你知道这段代码的作用吗?

    42220

    D语言的陷阱

    俺所说的是D在OOP上的理解。  现代编程语言基本都提供了OOP的编程机制,即封装,继承和多态。先声明一下,在这里我们讨论的主要是语言层面的OOP。...设计模式提及的OOP是在编程语言提供的OO机制上的升华,是代码如何有效组织,与语言上的OO机制有很大不同。D语言采用单根+接口的继承机制。...";} } 函数TestClassA()会执行成功吗?答案是肯定的。因为在不带修饰符的情况下,D语言默认是public级别,不论对象是全局函数,结构还是类,成员函数。...前面都好理解,但是连成员函数都默认是public,这就奇怪了。从OOP的角度来说,默认应该是保护级别的最大级别,尤其是在类中。在C++中,成员函数默认是private,这跟数据封装有关系。...";} } 有过C++经验的程序员看到上面这段代码,会不会认为这是段错误代码,能通过编译吗?答案是上面这段代码不但能通过编译,而且运行良好。为什么会这样?

    66110

    设计模式实战 - 中介者模式

    image Sale类中的getSaleStatus是获得销售情况 记住要把恰当的方法放到恰当的类中,销售情况只有销售人员才能反馈出来,通过百分制的机制衡量销售情况 我们再来看场景类是怎么运行的 Client...)和V(View,视图)隔离开,协调M和V协同工作,把M运行的结果和V代表的视图融合成一个前端可以展示的页面,减少M和V的依赖关系。...首先,既然是同事类而不是兄弟类(有相同的血缘),那就说明这些类之间是协作关系,完成不同的任务,处理不同的业务,所以不能在抽象类或接口中严格定义同事类必须具有的方法(从这点也可以看出继承是高侵入性的)。...当然,每个同事都要吃饭、上厕所,可以把这些最基本的信息封装到抽象中,但这些最基本的行为或属性是中介者模式要关心的吗?...使用中介模式就必然会带来中介者的膨胀问题,这在一个项目中是很不恰当的。大家可以在如下的情况下尝试使用中介者模式: ● N个对象之间产生了相互的依赖关系(N>2)。

    85651

    论文写作清单

    使用方法 根据以下每一项中的条目,在写作前与写作后,逐条对照自己的论文,看是否符合以下条目的规范。符合度越高,论文越有可能拿到高分,命中更好的期刊。...使用时,你能轻易地从笔记中找到需要的信息吗? 你知道什么是剽窃吗?如何分辨剽窃与合理引用? 文献中哪些信息是必须的,需要写入正文并在参考文献中引用?...文献中胡说八道的东西特别多,即便是高水平期刊也不例外。你能分清文章中,什么是对的,什么是错的吗? 文献中,研究者的研究方法是否合理? 文献中,研究者对该问题的研究有哪些优点?又有哪些不足?...文章中的每一个信息都有恰当的引用源吗? 引用的信息都有恰当的引用标识吗?如上标或者方括号? 参考文献列表有没有准备好?...你的语言风格合适吗?使用书面语了吗?是否使用了学术用语或者专业用语? 参考文献: 清单革命:如何正确处理事情[M]. Atul Gawande, Metropolitan Books, 2009.

    61440

    你就是函数响应式编程(FRP)啊?!【附 RxJS 实战】

    而在函数式编程里面,思想是利用数学方法来思考问题。阶乘的数学表达式是:f(n) = n*f(n - 1) (n > 1) ,f(n) = 1 (n = 1) ,利用递归解决问题。...事件流 函数响应式编程(FRP) 可以更加有效率地处理事件流,而无需管理状态。...事件流】被称为【被观察者序列】(observable sequences),其实被观察者是一种 Monads。...说明:既然是一种 Monads,就意味着存在延迟计算,即只有当变量真正使用时才去计算,整个链式遍历的过程也是这样。更多 RxJS 在 JS 中,能体现 FRP 的第三方框架是 RxJS。...、特点、以及相互之间的关系;也借助 RxJS 了解了函数响应式编程的代码实现; 后续还将带来更多关于 RxJS 的相关内容~ 如果觉得还不错的话,不如点个吧 O(∩_∩)O 我是掘金安东尼,输出暴露输入

    87910

    伙计们,Go 并没有那么简单

    “没有继承” Go(或许只是社区)似乎很反对“传统的 OOP”(不管这是指哪个,可能是 Java 或者 C++),我记得有人说 Go 没有继承是一件好事。...上面链接的文档说: 还有种区分内嵌与子类的重要手段。当内嵌一个类型时,该类型的方法会成为外部类型的方法,但当它们被调用时,该方法的接收者是内部类型,而非外部的。 有差别吗?...继承通常以相同的方式工作,继承的方法也对内部类型起作用。 在我看来,在 Go 中,真正唯一不同的是,多态性从结构中解耦。你需要使用接口来使用多态性。...但一旦你做了,做的事情和传统的 OOP 非常相似,包括方法覆盖 - 这里是个演示。 关于 Go,有件事令我很惊讶 —— 这门所谓简单的语言 —— 你甚至可以实现多重继承。确实很糟糕。...我认为,错误处理无论什么一直是一个 PITA(译注:应该是国外的一种比喻)。把一种风格换成另一种风格,你只需把一套问题换成另一套。没有好的方法。

    80160

    SpringBoot AOP 记录日志实例

    如果加上时间维度,AOP使OOP由原来的二维变为三维了,由平面变成立体了。从技术上来说,AOP基本上是通过代理机制实现的。 AOP在编程历史上可以说是里程碑式的,对OOP编程是一种十分有益的补充。...AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。...OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。...其依赖关系也由IOC容器负责管理。...AOP 并没有帮助我们解决任何新的问题,它只是提供了一种更好的办法,能够用更少的工作量来解决现有的一些问题,并且使得系统更加健壮,可维护性更好。

    1.8K11

    大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础

    2、它属于“结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。   3、函数式编程中,将函数也当做数据类型,因此可以接受函数当作输入(参数)和输出(返回值)。   ...2、不管有没有异常捕获,都会执行 finally,因此通常可以在 finally 代码块中释放资源。   ...2、如果使用普通的变量就不好管理。   3、使用一种新的数据类型:     (1) 可以管理多个不同类型的数据 [属性]。     (2) 可以对属性进行操作 => 方法。 类与对象的关系示意图 ?...*   * 3、修改上一个程序,编写一个方法,提供m和n两个参数,方法中打印一个m*n的矩形,再编写一个方法计算该矩形的面积(可以接收长len和宽width), 将其作为方法返回值。...6.4.2 回顾-Java 构造器的介绍+基本语法+特点+案例 Java 构造器的介绍   构造器(constructor)又叫构造方法,是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。

    2.2K10

    【C++掌中宝】类和对象(一):类的定义和实例化

    引言 面向对象编程(OOP)是一种编程范式,它通过将现实世界中的事物抽象为对象来组织和管理代码。OOP的核心概念包括类、对象、封装、继承和多态。...面向对象编程(OOP)的概念及其重要性: 概念: 对象:对象是现实世界中事物的抽象表示,包含了事物的属性和行为。在编程中,对象是一个具体的实例,拥有状态(属性)和行为(方法)。...这有助于保护对象的状态,防止外部直接访问和修改对象的私有属性。 继承:继承是类与类之间的关系,它允许一个类继承另一个类的属性和方法。通过继承,可以实现代码的重用和扩展。...重要性: 模块化:OOP将代码组织成独立的对象,使得代码更加模块化,易于管理和维护。 可重用性:通过继承和多态,OOP实现了代码的重用,减少了重复代码,提高了开发效率。...类和对象是OOP的核心,因为它们提供了一个结构化的方式来组织和管理代码,使得代码更加模块化、可重用和易于维护。 1. 什么是类? 类是对象的模板或蓝图,定义了对象的属性和方法。

    19010
    领券