首页
学习
活动
专区
工具
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方法我生成表格行用到

86510
  • 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); 面试官:还有其他方法?...和第一种方便相比,时间复杂度和空间复杂度都差不多,不过采用链表比较不容易出错。 面试官:还有更好方法? 我:卧槽,链表这么好方法还问我有没有更好?好家伙,嫌弃代码太长没耐心看?...方法三:递归 帅地被迫只能拿出我递归大法,递归思路每次我们删除了某一个士兵之后,我们就对这些士兵重新编号,然后我们难点就是找出删除前和删除后士兵编号映射关系

    31030

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

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

    55330

    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更明智选择。

    64730

    FW:面向方面开发

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

    64120

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

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

    88940

    关系数据库如何工作

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

    89820

    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仿真器存储数组元素方式有点关系。先走非合并数组维度、再走合并数组维度。

    57720

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

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

    41320

    D语言陷阱

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

    60710

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

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

    84551

    你就是函数响应式编程(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 我掘金安东尼,输出暴露输入

    84810

    论文写作清单

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

    59740

    SpringBoot AOP 记录日志实例

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

    1.8K11

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

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

    2.1K10

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

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

    79060

    Julia机器学习核心编程.3

    • 只能实现有限抽象类型。 逻辑式编程范式 逻辑式编程范式也称为基于规则编程范式。它基于谓词逻辑,解决问题一种声明性方法,其侧重于关系。比如Prolog就是一种逻辑式编程语言。...因此,Y = f(X)等价于表达式r(X,Y),其中r代表一种关系,它定义了X和Y关系。在基于规则编程,我们只需要提供事实(规则和公理),然后通过变量赋值来推测一些语句证明。...male(X) // X一个男性 father(F,X) // FX父亲 father(F,Y) // FY父亲 mother(M,X) // MX母亲 mother(M,Y) // M...面向对象编程范式 在面向对象(OOP编程范式,对象是抽象出来真实世界实体,对象具有行为或方法,通过行为或方法可以对对象状态进行修改。...区别在于其中一个方法在基类,另一个方法在派生类。通过重写,子类可以具有该方法特定实现。 • 重载:编译时多态,其中同一个类中有两个或多个方法具有相同名称,但签名不同。

    39920
    领券