在阅读Hibernate文档时,我不断看到对自然标识符概念的引用.
这是否仅仅意味着实体所具有的id由于其所拥有的数据的性质?
例如,用户的姓名+密码+年龄+某些东西被用作复合识别符?
哪一个是最佳实践,为什么?
外键是user.type到type.id:

外键是user.type到type.typeName:

我有以下内容:
target_content_type = models.ForeignKey(ContentType, related_name='target_content_type')
target_object_id = models.PositiveIntegerField()
target = generic.GenericForeignKey('target_content_type', 'target_object_id')
Run Code Online (Sandbox Code Playgroud)
我想dumpdata --natural为这种关系发出一个自然的关键.这可能吗?如果没有,是否有一种替代策略不会将我绑定到目标的主键?
如果我有一百个用户的表通常我会设置一个自动增量userID列作为主键.但是,如果突然我们有一百万用户或500万用户那么这变得非常困难,因为我希望开始变得更加分散,在这种情况下,自动增量主键将是无用的,因为每个节点将创建相同的主键.
解决方案是使用自然主键吗?我真的很难想到这群用户的自然主键.问题是他们都是年轻人,所以他们没有国家保险号码或我能想到的任何其他唯一标识符.我可以创建一个多列主键,但仍有机会,但重复次数发生微不足道.
有谁知道解决方案?
谢谢
我正在研究一种方法来序列化数据库A中的部分数据并在数据库B中对其进行反序列化(在不同安装之间进行一种保存/恢复)并且我已经看过Django 自然键以避免由于重复ID导致的问题.
唯一的问题是我应该为我的所有模型添加自定义管理器和新方法.有没有办法让Django通过查看unique=True或unique_togheter字段自动生成自然键?
据我所知,模型管理器的get_by_natural_key用于反序列化,而natural_key用于序列化.这是真的 ?如果不是,有什么区别?
而且,我们是否需要始终提供 - 自然 - 外国和 - 自然 - 主键?有没有办法强制通过自然键序列化/反序列化?
我使用通用外键将不同的配置文件与我Users继承的模型相关联auth.User.dumpdata虽然通过了--natural选项,但我无法做到.它说,
错误:无法解析序列化应用程序列表中myproject.AdminProfile,myproject.TeacherProfile,myproject.Users的依赖项.
根据文档,据说我们需要实现natural_key方法来获取和闪存涉及通用关系的灯具.我怎么能用这里展示的模型做到这一点?
class Users(User):
location = models.TextField('Location', blank=True)
created_by = models.ForeignKey('self', null=True, blank=True, related_name='created_by_user')
# Generic foreign key setup to hold the extra attributes
profile_contenttype = models.ForeignKey(ContentType, null=True, blank=True)
profile_object_id = models.PositiveIntegerField('Extra ID', null=True, blank=True)
profile_object = generic.GenericForeignKey('profile_contenttype', 'profile_object_id')
class AdminProfile(models.Model):
organization = models.CharField('Organization', max_length=100)
# profile reverse relation to get the user
users_link = generic.GenericRelation('Users', content_type_field='profile_contenttype',
object_id_field='profile_object_id')
class TeacherProfile(models.Model):
designation = models.CharField('Designation', max_length=100)
# profile reverse …Run Code Online (Sandbox Code Playgroud) generics django foreign-key-relationship natural-key dumpdata
这是我对广义自然键模型管理器的尝试.它就像文档,除了它尝试(不成功)从Meta.unique_together属性确定自然键字段名称.
class NaturalKeyModelManager(Manager):
def get_by_natural_key(self, *args):
field_dict = {}
for i, k in enumerate(self.model.Meta.unique_together[0]):
field_dict[k] = args[i]
return self.get(**field_dict)
Run Code Online (Sandbox Code Playgroud)
如果我在for循环之前插入调试打印,如下所示:
print dir(self.model.Meta)
Run Code Online (Sandbox Code Playgroud)
它根本没有列出unqiue_together属性:
['__doc__', '__module__', 'abstract']
Run Code Online (Sandbox Code Playgroud)
"抽象"有点让我担心,但另一个调试打印显示我尝试使用自然键管理的模型不是抽象的:
>>> print self.model.Meta.abstract
False
Run Code Online (Sandbox Code Playgroud)
我混合了很多抽象基类.这可能是问题吗?
class MixedModel(NamedModel, TimeStampedModel, VersionedModel, Model):
objects = NaturalKeyModelManager()
class Meta:
unique_together = (('name', 'version',),)
Run Code Online (Sandbox Code Playgroud)
为了完整性,这里是mixins之一:
class TimeStampedModel(Model):
created = DateTimeField(_("Created"), auto_now_add=True, null=True, editable=False)
updated = DateTimeField(_("Updated"), auto_now=True, null=True, editable=True)
class Meta:
abstract = True
Run Code Online (Sandbox Code Playgroud)
硬编码模型管理器工作得很好:
class MixedModelManager(Manager):
def get_by_natural_key(self, name, version):
return self.get(name=name, version=version)
Run Code Online (Sandbox Code Playgroud) 使用Hibernate的@NaturalId查找对象有什么好处吗?
我担心Hibernate使用@NaturalId执行两个查询以获取对象这一事实.第一个查询只是为了获取id和第二个查询来加载真实对象.
虽然有很多关于如何建模的信息,在JPA(2)中,一对一的关系 或具有自然键的实体,我还没有找到一个明确/简单的答案如何建模我们有两者的情况,即父表具有自然键的一对一关系.很明显,我可能错过了这样一个教程; 如果是这样的话,指点一个也可能就是答案.
而且,就像JPA和我这样的新手一样多次,当一个人需要比最基本的模型更多的时候,人们很快就会碰壁.
因此,考虑以下DB模型:
相应的JPA注释对象模型是什么?(因为我不想影响答案,所以我不遗余力地帮助你们了...)
也欢迎性能建议(例如"一对多可以更快地执行"等)!
谢谢,
natural-key ×10
django ×5
hibernate ×3
java ×3
jpa ×2
orm ×2
sql ×2
caching ×1
dumpdata ×1
generics ×1
metaclass ×1
one-to-one ×1
primary-key ×1
python-2.7 ×1