假设您需要使用一个实体构建一个应用程序,该实体可以与多种其他类型的实体相关联。例如,您有一个 Picture 实体,它可以与 Meal 实体、Person 实体、Boardroom 实体、Furniture 实体等相关联。我可以想出许多不同的方法来解决这个问题,但是——也许是因为我是 Core Data 的新手——我对它们中的任何一个都不满意。
想到的最明显的方法是简单地在 Picture 和支持关联图片的每个实体之间创建关系,但这看起来很草率,因为图片将有多个“空指针”。
另一种可能性是创造一个 super 实体——可想象的——或其他东西。每个支持关联图片的实体都是 Pictureable 的子实体,而 Picture 本身将与 Pictureable 一对一。我发现这种方法很麻烦,因为它不能在一个项目的上下文中使用多次(因为 Core Data 不支持多重继承)以及 Core Data 似乎为任何给定的根实体创建一个表的方式——假设SQLite 支持——让我害怕将一大堆不同的子实体分组到一个共同的 super 实体的保护伞下(我意识到沿着这些思路思考可能有点过早优化的味道,所以如果我是个笨蛋请告诉我)。
第三种方法是为图片创建一个由“类型”和“UID”组成的组合键。假设我的数据模型中的每个实体都有一个 UID,我可以使用这个键从 Picture 实例派生一个关联的托管对象,反之亦然。这种方法让我很担心,因为它听起来在大量获取时可能会变得慢;它对我来说也不够原生。
第四种方法——我在我正在开发的应用程序中倾向于采用的方法——是为图片和 X(其中 X 是膳食、人员、 session 室等)创建子实体,并创建一个这两个子实体之间是一对一的。虽然这种方法似乎是百害而无一利,但对于我未经训练的人来说,它仍然显得深奥,所以我想知道是否有更好的方法。
编辑 1:在最后一段中,我的意思是说我倾向于为图片创建子实体只是,不是图片和 X。
最佳答案
我认为这个主题的最佳变体是(不一定按顺序):
为与 Meal、Person、Boardroom 等相关联的图片使用单独的实体。这些实体可能都具有相同的属性,而且它们实际上可能都使用相同的类实现。这并没有错,而且它使得在每种实体和存储其图片的实体之间建立双向关系变得简单。
使图片成为每个实体类型的属性,而不是单独的实体。如果将实际图片数据存储在数据库中,就效率而言,这不是一个好计划,但如果将图像存储为单独的文件并将该文件的路径存储在属性中,那就没问题了。如果图片或记录数较少,即使将图片数据存储在数据库中也可能不是问题。
对所有图片使用单个实体,但省略与关联实体的反向关系。有一个 helpful SO question 考虑了这一点,并且接受的答案链接到文档的更有用的 Unidirectional Relationships 部分。如果您不需要 picture->owner 关系,这可能是解决您的问题的一个很好的解决方案,但您应该在走这条路之前了解可能的风险。
如您在列出的第一个选项中所述,为每种可能的所有者提供您的图片实体单独的关系。如果您需要能够作为一个组访问所有图片并且需要从图片到其所有者的关系,并且如果可能的所有者实体的数量相对较少,这可能是您的最佳选择,即使它拥有空属性似乎很草率。
正如您所注意到的,当您对实体使用继承时, all the sub-entities end up together in one big table 。因此,您的第四个选项(为每种图片使用子实体)在本质上与您的第一个选项类似。
更多地考虑这个问题,我倾向于使用实体继承来为与每种类型的所有者实体关联的图片创建子实体。 Picture 实体将只存储与任何图片关联的数据。每个子实体,如 MealPicture 和 PersonPicture,都会为其自己的特定类型的所有者添加关系。通过这种方式,您可以获得双向 Meal<->MealPicture 和 Person<->PersonPicture 关系,并且因为每个子实体都继承了所有常见的 Picture 内容,所以您避免了困扰您的 DRY 违规。简而言之,您可以获得上面选项 1 和 3 的大部分最佳部分。在底层,Core Data 像上面的选项 4 一样管理图片,但在使用中每个图片子实体只公开一个关系。
->->
关于objective-c - 一个架构师如何在 Core Data 中创建具有通用关系的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6615591/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende