django社交类程序笔记(6)构建一对一关系

数据库中外键关联,

1. 关系分类

一对一关系
一对多关系
多对多关系

2外键的优缺点

优点:
由数据库自身保证数据一致性和完整性,数据更可靠
可以增加 ER 图的可读性
外键可节省开发量
缺点:
性能缺陷,有额外开销
主键表被锁定时,会引发外键表也被锁
删除主键表的数据时,需先删除外键表的数据
修改外键表字段时,需重建外键约束
不能⽤于分布式环境
不容易做到数据解耦

3. 应用场景

适⽤场景: 内部系统、传统企业级应⽤可以使⽤ (需要数据量可控, 数据库服务器数量可控)
不适⽤场景: 互联⽹⾏业不建议使⽤

4. ⼿动构建关联

  1. ⼀对多: 主表 id 与 ⼦表 id 完全⼀⼀对应
  2. ⼀对多: 在"多"的表内添加"唯⼀"表 id 字段
  3. 多对多: 创建关系表, 关系表中⼀般只存放两个相关联的条⽬的 id

扩展:数据分片,外键没法做分布式数据库,大型互联网禁止使用外键。
如果不使用外键,怎么建立关联呢?
第一步分析两个表的关系。
用户和配置是一对一的关系。
django里的数据库操作不要用循环,运算直接使用count(),exists(),因为数据库和django实际开发中是两个电脑,通过tcp链接的,尽量减少运算。

User.objects.filter(id_range=(1,100)).only('name','age')

操作不当,写出来的语句就是比别人慢。
QuerySet
⽅法
创建: create() / get_or_create() / update_or_create() /
bulk_create()(创建大量数据,批量创建。)
条件过滤和排除: filter() / exclude()
只加载需要的字段: only() / defer()
order_by() / count() / exists()
latest() / earliest()
first() / last()

复习下orm,然后开始继续编写model.py中代码:

class User(models.Model):
	...
   @property
    def profile(self):
        """用户的配置项"""
        my_profile, created = Profile.objects.get_or_create(id=self.id)
        return my_profile

如果出现下面查询,就会出现查询好几次,性能就会很差。如何解决这个问题?

profile = user.profile
profile.location
profile.min_dating_age
profile.max_distance

python 是动态语言,取完profile,然后把它加给self._profile,作为私有属性,相当于给self加了一个字典的值,修改如下:

@property
    def profile(self):
        """用户的配置项"""
        # if '_profile' not in self.__dict__:
        if not hasattr(self, '_profile'):
            _profile, created = Profile.objects.get_or_create(id=self.id)
            self._profile = _profile
        return self._profile
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值