对象关系Lookup与Master-Detail

本文介绍了Salesforce中的两种对象关系——Lookup和Master-Detail,讲解了它们的特性和应用场景。Lookup关系允许从一个对象链接到另一个,支持一对一和一对多关系;而Master-Detail关系更为紧密,主记录控制细节记录的行为,如删除主记录会自动删除所有子记录。文章还对比了两者在数据删除、共享规则和权限设定上的差异,并讨论了如何在特定情况下将主从关系转换为Lookup关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Lookup 

创建一个对象链接到另一个对象的关系。关系字段允许您从一个对象记录在另一个对象中浏览到相关记录。查找关系可以被用来创建一对一和一对多的关系。当你定义一个查找关系,你可以布局页面包括该对象的查找字段,以及建立关联对象的页面布局一类表。

2、Master-Detail

这种类型的关系紧密地将对象联系在一起,使得主记录控制的细节和记录的子细节的某些行为。在主从关系中,详细记录的所有权和共享由主记录确定,当删除主记录,它的所有详细信息记录与它一起被自动删除。在主从关系中,总是需要在详细记录,缺少详细记录将会报错。

3、Lookup与Master-Detail之间的差异

根本区别是数据的删除与共享

A、主从关系通常用于当有两个对象之间的直接依赖

a.无主记录您不能创建一个详细记录。
b.删除一个主记录,所有的详细信息记录被自动删除。
c

<think>嗯,用户这次的问题是关于缓存配置的,具体是询问"lookup.partial-cache"中的"expire-after-write"设置。从技术角度看,这属于缓存策略的细粒度配置,用户应该是在开发中遇到了具体需求。 用户可能正在使用某个支持部分缓存的框架,比如Spring Cache或类似工具。ta的query里提到"lookup.partial-cache",这个命名风格让我联想到Spring Cache的@Cacheable配置,或者是自定义的缓存抽象层。用户没有说明具体技术栈,但"expire-after-write"是通用概念,在Caffeine、Guava Cache等库都有类似实现。 考虑到用户直接询问配置用法,ta可能已经实现了基本缓存功能,现在需要优化过期策略。这里的关键点是"partial-cache""write"的关联——这种配置通常用于解决缓存穿透问题,即当缓存未命中时,只缓存部分结果或空值避免重复查询数据库。 用户可能遇到的实际场景是:某个查询结果可能为空,但又不希望频繁穿透到数据库。通过"expire-after-write"设置短时效,可以在减轻数据库压力的同时保证数据最终一致性。这个需求在电商库存查询、权限校验等场景很常见。 需要提醒用户注意几个技术细节:首先是时间单位问题,不同框架默认单位不同(秒/毫秒);其次是"after-write""after-access"的区别,用户要确认自己需要的是写入后固定时间失效,还是访问后刷新时效;最后是是否要配合"refresh"机制使用,这在部分缓存库支持后台刷新。 用户没有提到并发场景,但这是个潜在痛点。当大量请求同时遇到缓存失效时,如果没有额外保护(如加锁或队列),可能导致缓存击穿。建议在配置过期时间时同步考虑加载策略。 关于配置示例,我决定给出两种主流技术栈的写法:Spring CacheCaffeine原生API。这样无论用户用哪种方案都能参考。考虑到用户query里带点号(lookup.partial-cache),更可能是Spring配置式用法,所以把YAML写法放在前面。 用户情绪上应该比较急切,因为缓存配置问题通常会阻塞开发进度。所以回复要直击重点,先给解决方案再解释原理。ta可能已经看过文档但被术语搞糊涂了,需要实际可粘贴的代码示例。另外,用户没提具体失效时间值,说明ta更关注机制而非具体数值,所以示例里用placeholder更合适。</think>在缓存策略中,`lookup.partial-cache` 结合 `expire-after-write` 是一种常见的设计模式,用于控制部分缓存结果的过期行为。以下是关键配置解析用法: --- ### **核心概念** 1. **`lookup.partial-cache`** 表示仅缓存部分查询结果(例如非完整数据集或特定条件下的结果),常用于减少重复计算或数据库查询。 2. **`expire-after-write`** 定义缓存项在**写入后固定时间自动过期**(访问频率无关),强制刷新数据以保证时效性。 --- ### **典型配置示例** #### 1. Spring Cache + Caffeine 配置(Java) ```yaml # application.yml caffeine: caches: partial-cache: spec: maximumSize=500, expireAfterWrite=10s, recordStats ``` 代码中使用注解: ```java @Cacheable(cacheNames = "partial-cache", key = "#userId") public PartialData getPartialData(String userId) { // 业务逻辑:仅缓存部分非敏感数据 } ``` #### 2. Guava Cache 手动配置(Java) ```java LoadingCache<KeyType, PartialData> partialCache = CacheBuilder.newBuilder() .maximumSize(1000) .expireAfterWrite(5, TimeUnit.MINUTES) // 写入5分钟后过期 .build(new CacheLoader<>() { @Override public PartialData load(KeyType key) { return fetchPartialData(key); // 缓存未命中时的加载逻辑 } }); ``` #### 3. Redis + Spring Data 配置 ```java @Bean public CacheManager redisCacheManager(RedisConnectionFactory factory) { RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofMinutes(30)) // 全局默认30分钟过期 .prefixCacheNameWith("partial:"); // 缓存键前缀 // 为特定缓存定制策略 Map<String, RedisCacheConfiguration> cacheConfigs = new HashMap<>(); cacheConfigs.put("partial-cache", config.entryTtl(Duration.ofSeconds(15))); // 覆盖为15秒 return RedisCacheManager.builder(factory) .withInitialCacheConfigurations(cacheConfigs) .build(); } ``` --- ### **使用场景最佳实践** 1. **适用场景** - 高频查询但数据变化容忍短时延迟(如排行榜、非实时统计) - 防止缓存穿透:缓存空值或默认结果并设置短过期时间(如 `expireAfterWrite=30s`) - 代价较高的计算结果的临时缓存 2. **避坑指南** - **冷启动问题**:系统重启后集中重建缓存可能导致雪崩,建议添加随机抖动(如 `expireAfterWrite=10m+random(2m)`) - **数据一致性**:写入后立即过期可能不适用强一致场景,需结合主动刷新策略 - **资源控制**:始终配置 `maximumSize` 防止内存溢出 --- ### **常见问题解答** #### Q1:`expire-after-write` `expire-after-access` 区别? - **after-write**:基于写入时间固定过期(如 `5m` 后必过期) - **after-access**:基于最后访问时间滑动过期(每次访问重置倒计时) 👉 选择依据:若需强制刷新数据用 `after-write`;若需高频访问长期保留用 `after-access` #### Q2:如何验证缓存是否按预期过期? - **Spring Actuator**:通过 `/actuator/caches` 端点检查缓存状态 - **Redis 命令**:`TTL key_name` 查看剩余生存时间 - **日志监控**:记录缓存命中/加载事件,如 Caffeine 的 `recordStats()` > 配置示例:Caffeine 监控统计 > ```java > @Bean > public CaffeineCacheManager cacheManager() { > Caffeine<Object, Object> caffeine = Caffeine.newBuilder().recordStats(); > return new CaffeineCacheManager("partial-cache", caffeine::build); > } > ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值