Cache数据库创建父子表及子表存储结构解析

版权申诉
0 下载量 90 浏览量 更新于2024-07-01 收藏 5.13MB PDF 举报
"在Cache数据库studio下创建父子表的步骤及注意事项" 在Cache数据库环境中,创建父子表是一个重要的数据组织方式,它有助于维护数据的层次结构并优化查询效率。以下是对创建父子表过程的详细说明: 1. **创建父子表**: - 首先,你需要在Cache数据库Studio中新建属性,这将代表你的父表。 - 新建属性完成后,系统会自动生成子表。你可以通过编译来确保子表的正确创建。 2. **子表的存储结构**: - 子表的存储结构通常包含`IdLocation`和`IndexLocation`字段。这两个字段是关键,它们定义了子表数据在全局字典中的位置。 - `IdLocation`可以被设置为`{%%PARENT}("TPChild")`,这样子表的标识将关联到父表。 - 同样,`IndexLocation`也可以更新为`{%%PARENT}("TPChild")`,确保子表的索引与父表关联。 3. **数据插入与查询**: - 插入数据时,必须注意父表中的ID。例如,`TPSParref`记录了父表的ID,子表的数据插入必须依赖于父表存在的ID。 - 如果父表中不存在某个ID,那么尝试插入与其相关的子表数据将会失败。也就是说,子表的数据是父表的下一级数据。 4. **持久类与表格映射**: - 编译后的所有持久类都会在下方显示对应的table,这有助于跟踪数据存储的位置。 5. **存储结构与查询效果**: - CacheStorage的存储结果通常采用`AA^BB^CC`的形式,而SQLStorage的结构可能不同。 - 例如,`^DHCMed.Test("Person",1,"TPChild",1)`表示子表中的具体数据,其中`^DHCMed.Test("Person",1,"TPChild")`表示子表的`idlocation`,而`^DHCMed.Test("Person",1,"TPChild",1)`则对应子表的`DataLocation`和`DataNotes`。 6. **使用{%%PARENT}引用**: - `{%%PARENT}`是一个特殊符号,它代表父表的所有实例,这在建立父子表的索引时非常有用。 7. **保持全局一致性**: - 最佳实践是让父子表共享同一个全局字典(Global),这有利于数据的一致性和查询效率。 8. **问题与解决**: - 提到的`^DHCMed.Testi("Person","TPChild")IndexLocation`和`^DHCMed.Test("Person",1,"TPChild",1)$lb("","AAAA","BBB")`可能存在的问题,这可能涉及到特定的索引配置或数据格式错误,需要进一步排查。 创建Cache数据库中的父子表涉及多个步骤,包括设置正确的存储结构、理解数据插入规则以及优化查询性能。遵循最佳实践,如使用相同的全局字典,能够有效地管理和操作层级数据。
2023-01-08 上传
数据库表的设计 不是数据库表设计⼤神 最近做订单系统,出现问题是这样的, 有客户表,订单表,套餐表. 通过下单⽣成订单表. 付款后更改订单状态码为1(表⽰已付款) (1)如果甲订购2份黄焖鸡⽶饭,1瓶矿泉⽔,那么这个订单如何保存这个数据? 剖析: 整个订单系统还要能通过⽤户修改已下单但未付款的订单内容吗?(或许直接取消这次订单重新下单更好) 每个套餐的数量要放⼊⼀个food_numbers字段中,这个字段放在哪⾥才合适?不在foods这个⾷品套餐表,因为 foods 表中纯粹是⾷品套餐 信息. 要有⼀个表可以存放点选的套餐的food_id和food_numbers,(但如果如下图,使⽤字符串字段,存放着food_name,food_numbers,及单笔* 数量的price) (2)通过varchar(2)的字段不可再查,不太灵活. 如果是有个购物车表,(其实可以想成 Order_id ,订单表) 每个⼩订单,存放着订单序列ID,⽤户ID,及⾷品套餐ID,及这个套餐的订购数量. 这样通过 food_id 可以修改其数量,⽽且通过这个 card_id 保存不同的 food_id 及数量. 然后在订单表中加⼊这个 cart_id 作为外键,但这个 cart_id 必须保持是相同的,⽽不是序列⽣成的. (3)⼀个⼈购物,⼀般是⽤⼀个购物车,购物篮. ⽤户在同⼀时间购买多样的⾷品及其数量.按下[下单]按钮,此时只⽣成⼀个 cart_id ,但表中这次购买下单的元组为有⼏样不同的就⼏ ⾏元组. Dao 层可以获取要插⼊的下⼀个序列的值,传导时虽然执⾏了两次 Dao 与数据库的 SQL 连接, (cart_id,customer_id,food_id,food_numbers) 也就是说,这个 createNewCart( cart_id,customer_id,food_id,food_numbers ) 的 Service 层接收的是⼀个这样的数据: import java.util.ArrayList; public class Carts { private long cart_id;//购物车ID private long customer_id;//⽤户ID private ArrayList<Long> food_id;//⾷品(商品)ID private ArrayList<Integer> food_numbers;//⾷品数量值 /* 客户下单后创建此对象 new Carts(接收⼀个购物车数据) public Carts(long cart_id, long customer_id, ArrayList<Long> food_id, ArrayList<Integer> food_numbers) { this.cart_id = cart_id; this.customer_id = customer_id; this.food_id = food_id; this.food_numbers = food_numbers; } } 但传导的数据应是多个,即集合的 food_id 和 food_numbers. ⽽ cart_id 是那么⼀个,⽤户 ID( customer_id )是那么⼀个,这俩 ID 在⼀次下单是只是那么同⼀个, ⽽购物车中的 food 和数量是不固定的,所以使⽤ ArrayList<Long/Integer> 存储起来. (4)使⽤ CartsService 待更,今天太晚了,开着博客码代码了逻辑通顺了. 不完善 待更新 将编程看作是⼀门艺术,⽽不单单是个技术。 敲打的英⽂字符是我的⿊⽩琴键, 思维图纸画出的是我编写的五线谱。 当美妙的华章响起, 现实通往⼆进制的⼤门即将被打开。