热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用多对多NHibernate映射防止重复的标记名称-Preventingduplicatetagnameswithmany-to-manyNHibernatemapping

ImusingNHibernatetopersistmyItemclasstoaSQLdatabase.TheItemclasshasapropertyItem.

I'm using NHibernate to persist my Item class to a SQL database. The Item class has a property Item.Tags of type ICollection which I am mapping using the following NHibernate configation.

我正在使用NHibernate将我的Item类持久化到SQL数据库。 Item类有一个ICollection 类型的属性Item.Tags,我使用以下NHibernate配置进行映射。


  
  

Also here's my mapping for my Tag class, which simply has an int ID and a string name.

这里也是我的Tag类的映射,它只有一个int ID和一个字符串名称。


    
        
    
    

This all works fine, yet it allows duplicate tags to be created with the same name. Thus the code below will create three separate "foo" entries in the Tags table all with separate IDs.

这一切都很好,但它允许使用相同的名称创建重复的标签。因此,下面的代码将在Tags表中创建三个单独的“foo”条目,所有条目都具有单独的ID。

myItem1.Tags.Add(new Tag("Foo"));
myItem2.Tags.Add(new Tag("Foo"));
myItem3.Tags.Add(new Tag("Foo"));

This is obviously not how I want this to work. I could add a unique constraint to the Tags.Name column, but then the code above would only thrown an exception.

这显然不是我希望这个工作的方式。我可以为Tags.Name列添加一个唯一的约束,但是上面的代码只会抛出异常。

On the object model side I want to be able to simply add and remove tags from an Item by editing a collection of Tag or String. However, when my items are persisted to the database it should figure out what new tags need to be created and when it should be mapping to existing entries in the Tags table.

在对象模型方面,我希望能够通过编辑Tag或String的集合来简单地添加和删除Item中的标签。但是,当我的项目持久化到数据库时,它应该确定需要创建哪些新标记以及何时应该映射到Tags表中的现有条目。

I've also considered changing this to a value based one-to-many relationship where Item.Tags would simply be a IList and would map to a single Tags table with entries for every individual tag on every Item. This would work as well, but I think I would prefer the first, as it would make finding items with a specific tag more efficient. I'm pretty new to relational databases as well. So I'm not even sure if this should be a concern.

我还考虑将其更改为基于值的一对多关系,其中Item.Tags将只是一个IList ,并将映射到单个Tags表,其中包含每个Item上每个单独标记的条目。这也可以,但我认为我更喜欢第一个,因为这样可以更有效地查找具有特定标签的项目。我对关系数据库也很陌生。所以我甚至不确定这是否应该引起关注。

2 个解决方案

#1


0  

Having two Tag entities with the same name is useless, as you'd have to search by name or the results wouldn't be what you expect.

拥有两个具有相同名称的Tag实体是没用的,因为您必须按名称搜索,否则结果将不是您所期望的。

So, the only possible solutions are the ones you've considered: making Tag.Name unique, or removing the entity completely and mapping tags as an ICollection.

因此,唯一可能的解决方案是您考虑过的问题:使Tag.Name唯一,或者完全删除实体并将标记映射为ICollection。

Since space is cheap and you'll be indexing that column anyway, the latter is a simpler approach, although you lose a little flexibility if you want stackoverflow-like tags management (synonyms, etc)

由于空间很便宜而且你无论如何都会索引该列,后者是一种更简单的方法,尽管如果你想要类似stackoverflow的标签管理(同义词等)你会失去一点灵活性

#2


0  

If you want to try DDD, then the solution would look something like this:

如果你想尝试DDD,那么解决方案看起来像这样:

public class Item
{
  public IList Tags {get;set;}
  public void AddTag(String tagName)
  {
    var tagAlreadyExists = Tags.Any(a=>String.Compare(a.Name,tagName,StringComparison.OrdinalIgnoreCase)==0;
    if (tagAlreadyExists )
      return; // Or throw exception
    Tags.Add(new Tag(tagName));
  }
}

Basically the Aggregate Root (Item) is responsible for enforcing the rule that Tags must be unique.

基本上,聚合根(项)负责执行标记必须唯一的规则。


推荐阅读
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • 在软件开发领域,“池”技术被广泛应用,如数据库连接池、线程池等。本文重点探讨Java中的线程池ThreadPoolExecutor,通过详细解析其内部机制,帮助开发者理解如何高效利用线程池管理任务执行。线程池不仅能够显著减少系统资源的消耗,提高响应速度,还能通过合理的配置,如饱和策略,确保在高负载情况下系统的稳定性和可靠性。文章还将结合实际案例,展示线程池在不同应用场景下的具体实现与优化技巧。 ... [详细]
  • SQL取整函数详解:ROUND四舍五入、FLOOR向下取整与CEILING向上取整的应用与区别 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
  • 本章节从商业数据分析与挖掘的角度,深入探讨了特征工程的关键技术和应用方法,包括数据预处理、特征构建、特征提取及特征选择。详细阐述了如何系统地构建用于分析的结构化数据,为全栈开发提供了坚实的基础。 ... [详细]
  • 在Unity3D的第13天学习中,我们深入探讨了关节系统和布料模拟技术。关节系统作为Unity中的关键物理组件,能够实现游戏对象间的动态连接,如刚体间的关系、门的开合动作以及角色的布娃娃效果。铰链关节涉及两个刚体的交互,能够精确模拟复杂的机械运动,为游戏增添了真实感。此外,布料模拟技术则进一步提升了角色衣物和环境装饰物的自然表现,增强了视觉效果的真实性和沉浸感。 ... [详细]
  • 本文深入剖析了ScheduledThreadPoolExecutor的并发执行机制及其源代码,详细解读了该线程池如何在指定延时或定期执行任务,探讨了其内部的工作原理和优化策略,为开发者提供了宝贵的参考和实践指导。 ... [详细]
  • 在启用分层编译的情况下,即时编译器(JIT)的触发条件涉及多个因素,包括方法调用频率、代码复杂度和运行时性能数据。本文将详细解析这些条件,并探讨分层编译如何优化JVM的执行效率。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
author-avatar
手机用户2502892403
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有