eXtremeDB数据库设计指南:遵循IEEE 802.15.4-2015 Zigbee标准

需积分: 48 10 下载量 37 浏览量 更新于2024-08-07 收藏 1.78MB PDF 举报
本章节深入探讨了数据库设计在eXtremeDB(一款内存数据库系统)中的应用,针对IEEE 802.15.4-2015标准下Zigbee环境下的数据库设计策略。首先,作者强调了本章并非详尽介绍数据库设计的全面教程,而是着重于帮助读者理解eXtremeDB的工作原理和在设计过程中应考虑的关键因素。 逻辑设计阶段,关注的是数据的抽象组织,例如选择合适的数据对象,定义它们之间的关系,确定访问方法,以及满足应用程序的性能需求。在这个过程中,设计师需决定如何建立索引,如使用散列索引还是树型索引,如何为支持顺序访问的类设置列表属性,以及如何利用oid(对象标识符)和ref、autoid等机制来关联不同类。非规范化的向量也可能被考虑在内,尽管这可能不完全遵循关系数据库的标准范式。 物理设计方面,涉及到数据库的存储细节,如页大小、初始数据库大小、字段的可选性以及类的紧凑性。作为内存数据库,eXtremeDB无需过多关注文件格式或记录格式,因为这些问题由模式编译器自动优化。然而,由于其内存限制,有一些硬性规定,如最大类数、字段数、对象数、索引数量、索引字段数以及向量元素数量等,需在设计时加以考虑。 值得注意的是,eXtremeDB的局限性主要体现在上述的存储容量和结构限制上,如最大数据库大小、对象大小、索引大小等。字符串长度也有限制,对于过长的文本,应采用blob(二进制大对象)存储。在实际操作中,虽然页尺寸有一定范围,但在大多数情况下,用户通常不会感受到这个限制。 本章的目标是让读者掌握在使用eXtremeDB进行数据库设计时的关键思考和决策,以便他们能根据自身项目需求创建出合适的数据库结构。对于数据库设计者来说,理解和遵循这些原则至关重要,以确保高效、灵活且符合实际性能需求的数据库设计。

void SerialApp_ProcessMSGCmd( afIncomingMSGPacket_t *pkt ){ uint8 stat; uint8 seqnb; uint8 delay; switch ( pkt->clusterId ) { // A message with a serial data block to be transmitted on the serial port. case SERIALAPP_CLUSTERID1: // Store the address for sending and retrying. osal_memcpy(&SerialApp_RxAddr, &(pkt->srcAddr), sizeof( afAddrType_t )); seqnb = pkt->cmd.Data[0]; // Keep message if not a repeat packet if ( (seqnb > SerialApp_RxSeq) || // Normal ((seqnb < 0x80 ) && ( SerialApp_RxSeq > 0x80)) ) // Wrap-around { // Transmit the data on the serial port. if ( HalUARTWrite( SERIAL_APP_PORT, pkt->cmd.Data+1, (pkt->cmd.DataLength-1) ) ) { // Save for next incoming message SerialApp_RxSeq = seqnb; stat = OTA_SUCCESS; } else { stat = OTA_SER_BUSY; } } else { stat = OTA_DUP_MSG; } // Select approproiate OTA flow-control delay. delay = (stat == OTA_SER_BUSY) ? SERIALAPP_NAK_DELAY : SERIALAPP_ACK_DELAY; // Build & send OTA response message. SerialApp_RspBuf[0] = stat; SerialApp_RspBuf[1] = seqnb; SerialApp_RspBuf[2] = LO_UINT16( delay ); SerialApp_RspBuf[3] = HI_UINT16( delay ); osal_set_event( SerialApp_TaskID, SERIALAPP_RESP_EVT ); osal_stop_timerEx(SerialApp_TaskID, SERIALAPP_RESP_EVT); break; // A response to a received serial data block. case SERIALAPP_CLUSTERID2: if ((pkt->cmd.Data[1] == SerialApp_TxSeq) && ((pkt->cmd.Data[0] == OTA_SUCCESS) || (pkt->cmd.Data[0] == OTA_DUP_MSG))) { SerialApp_TxLen = 0; osal_stop_timerEx(SerialApp_TaskID, SERIALAPP_SEND_EVT); } else { // Re-start timeout according to delay sent from other device. delay = BUILD_UINT16( pkt->cmd.Data[2], pkt->cmd.Data[3] ); osal_start_timerEx( SerialApp_TaskID, SERIALAPP_SEND_EVT, delay ); } break; case SERIALAPP_CONNECTREQ_CLUSTER: SerialApp_ConnectReqProcess((uint8*)pkt->cmd.Data); case SERIALAPP_CONNECTRSP_CLUSTER: SerialApp_DeviceConnectRsp((uint8*)pkt->cmd.Data); default: break; }}每行代码注释

2023-06-06 上传