Django-link-archive项目中的NULL值排序问题解析

Django-link-archive项目中的NULL值排序问题解析

Django-link-archive Self-hostable link database Django-link-archive 项目地址: https://gitcode.com/gh_mirrors/dj/Django-link-archive

在Django ORM开发过程中,经常会遇到需要对包含NULL值的字段进行排序的场景。本文将以Django-link-archive项目为例,深入探讨如何正确处理数据库查询结果中NULL值的排序问题。

NULL值排序的常见需求

在数据库操作中,NULL值表示缺失或未知的数据。当我们需要对包含NULL值的字段进行排序时,数据库系统通常会有默认的排序行为:

  1. 在升序排序(ASC)时,NULL值会默认排在最前面
  2. 在降序排序(DESC)时,NULL值会默认排在最后面

然而,实际业务需求可能要求我们改变这种默认行为。例如,在Django-link-archive项目中,开发者可能需要将NULL值强制排在最后,无论排序方向如何。

Django中的解决方案

Django ORM提供了NullsLastNullsFirst函数来精确控制NULL值在排序结果中的位置。这两个函数是Django 3.1版本引入的数据库函数,可以配合F()表达式和排序方向一起使用。

基本用法

from django.db.models import F
from django.db.models.functions import NullsLast

Model.objects.order_by(NullsLast(F('date_published').desc()))

这段代码实现了以下功能:

  1. date_published字段进行降序排序
  2. 将NULL值强制放在排序结果的最后

其他变体

如果需要将NULL值放在排序结果的最前面,可以使用NullsFirst

from django.db.models.functions import NullsFirst

Model.objects.order_by(NullsFirst(F('date_published').asc()))

实现原理

在底层,Django会根据使用的数据库后端生成相应的SQL语句。例如,对于PostgreSQL数据库,上述代码会生成类似以下的SQL:

SELECT * FROM model_table ORDER BY date_published DESC NULLS LAST

而对于MySQL数据库,由于MySQL原生不支持NULLS LAST语法,Django会生成更复杂的SQL来实现相同的效果:

SELECT * FROM model_table 
ORDER BY 
    CASE WHEN date_published IS NULL THEN 1 ELSE 0 END,
    date_published DESC

实际应用场景

在Django-link-archive这样的链接存档项目中,NULL值排序控制特别有用:

  1. 当链接的发布日期(date_published)为NULL时,可能表示该链接尚未正式发布
  2. 在展示链接列表时,我们希望已发布的链接按日期排序,而未发布的链接统一显示在最后
  3. 使用NullsLast可以确保这种展示逻辑的一致性

性能考虑

需要注意的是,NULL值的特殊排序处理可能会对查询性能产生一定影响,特别是在大型数据集上。如果某个字段经常需要以NULL值参与排序,建议考虑以下优化措施:

  1. 为该字段添加适当的数据库索引
  2. 尽量避免在频繁执行的查询中使用复杂的NULL值排序
  3. 对于可为NULL的字段,考虑使用默认值代替NULL

总结

Django ORM提供的NullsLastNullsFirst函数为开发者提供了对NULL值排序行为的精确控制能力。在Django-link-archive等实际项目中,合理使用这些功能可以确保数据展示符合业务需求,同时保持代码的清晰和可维护性。理解这些高级排序技巧,将有助于开发者构建更加灵活和强大的数据库查询逻辑。

Django-link-archive Self-hostable link database Django-link-archive 项目地址: https://gitcode.com/gh_mirrors/dj/Django-link-archive

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

资源下载链接为: https://pan.quark.cn/s/502b0f9d0e26 在进行STM32F103C8T6与HC - 06蓝牙模块、PC端以及ROS(机器人操作系统)的串口通信测试时,我们编写了以下程序。 硬件连接 将STM32F103C8T6的USART1的TX(PA9)引脚与HC - 06的RX引脚相连,同时将USART1的RX(PA10)引脚与HC - 06的TX引脚相连,以实现两者之间的串口通信。 另外,通过串口转USB模块(如CH340等)将STM32F103C8T6与PC端连接起来,方便在PC端进行通信数据的发送和接收。 程序功能 初始化USART1,设置波特率为9600,用于与HC - 06通信。同时,初始化USART2(连接串口转USB模块),波特率同样设置为9600,用于与PC端通信。 在主循环中,STM32F103C8T6不断检测USART1和USART2是否有数据接收。当从USART1(HC - 06)接收到数据时,将数据暂存到一个缓冲区中,然后通过USART2发送给PC端。反之,当从USART2(PC端)接收到数据时,也暂存到缓冲区,再通过USART1发送给HC - 06。这样就实现了STM32F103C8T6作为中间节点,将HC - 06与PC端的数据进行转发。 硬件连接 HC - 06蓝牙模块通过串口与STM32F103C8T6连接,如上所述。 程序功能(蓝牙通信部分) HC - 06在默认状态下会自动进入配对模式,等待与手机或其他蓝牙设备配对。当配对成功后,它会将从蓝牙设备接收到的数据通过串口发送给STM32F103C8T6。同时,它也会将STM32F103C8T6发送过来的数据转发给已配对的蓝牙设备。在本测试程序中,主要关注其与STM32F103C8T6之间的串口通信功能,确保数据能够正确地在两者之间传输。 硬件连接 通过串口
内容概要:本文详细介绍了一个基于两个单片机串行通信的电子密码锁项目项目背景指出随着信息技术的发展,电子密码锁因其高可靠性、低成本等优势成为主流选择。项目采用主控和辅助两个单片机分别负责不同功能模块,并通过串行通信(如UART协议)实现数据交互。主控单片机处理密码输入验证、用户界面显示等,辅助单片机负责锁控制。系统还涉及多级安全防护、低功耗设计、友好的用户界面等特性。项目挑战包括确保通信稳定、提升密码验证安全性、优化电源管理和用户交互设计等。项目创新点在于双单片机协同工作、串行通信协议优化、多级安全防护以及低功耗设计。; 适合人群:对嵌入式系统开发有一定了解,特别是对单片机编程、串行通信协议、密码锁设计感兴趣的工程师或学生。; 使用场景及目标:①适用于家庭安防、商业办公、银行金融、智能酒店、医疗行业等需要高安全性的场所;②帮助开发者掌握双单片机协同工作的原理,提高系统的稳定性和安全性;③通过实际项目加深对串行通信协议的理解,掌握密码锁系统的软硬件设计方法。; 阅读建议:建议读者结合实际硬件设备进行实践操作,重点理解串行通信协议的设计与实现,同时关注密码验证的安全性设计和电源管理优化。此外,可以通过提供的代码示例加深对各功能模块的理解,并尝试修改和优化代码以适应不同的应用场景。
--DATE:2023-10-27 --CONTENT:KMPLM-6979 新增与优化变更配置项管理和菜单入口 by 薛启宽 DECLARE VN INT; BEGIN SELECT COUNT(1) INTO VN FROM plm_cls_define WHERE CCLSID = 754; IF VN = 0 THEN insert into plm_cls_define (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (754, 750, 'EbomChangeIssue', null, null, 'ECI', 'EBOM问题报告', 'PLM_EbomChangeIssue', '5,7,70,251,750,754', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 1, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define WHERE CCLSID = 755; IF VN = 0 THEN insert into plm_cls_define (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (755, 750, 'PbomChangeIssue', null, null, 'PCI', 'PBOM问题报告', 'PLM_PbomChangeIssue', '5,7,70,251,750,755', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 2, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define WHERE CCLSID = 756; IF VN = 0 THEN insert into plm_cls_define (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (756, 751, 'EbomChangeRequest', null, null, 'ECR', 'EBOM变更申请', 'PLM_EbomChangeRequest', '5,7,70,251,751,756', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 1, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define WHERE CCLSID = 757; IF VN = 0 THEN insert into plm_cls_define (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (757, 751, 'PbomChangeRequest', null, null, 'PCR', 'PBOM变更申请', 'PLM_PbomChangeRequest', '5,7,70,251,751,757', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 2, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define WHERE CCLSID = 758; IF VN = 0 THEN insert into plm_cls_define (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (758, 752, 'EbomChangeOrder', null, null, 'ECO', 'EBOM变更指令', 'PLM_EbomChangeOrder', '5,7,70,251,752,758', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 1, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define WHERE CCLSID = 759; IF VN = 0 THEN insert into plm_cls_define (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (759, 752, 'PbomChangeOrder', null, null, 'PCO', 'PBOM变更指令', 'PLM_PbomChangeOrder', '5,7,70,251,752,759', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 2, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define WHERE CCLSID = 760; IF VN = 0 THEN insert into plm_cls_define (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (760, 753, 'EbomChangeActivity', null, null, 'ECA', 'EBOM变更活动', 'PLM_EbomChangeActivity', '5,7,70,251,753,760', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 3, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define WHERE CCLSID = 761; IF VN = 0 THEN insert into plm_cls_define (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (761, 753, 'PbomChangeActivity', null, null, 'PCA', 'PBOM变更活动', 'PLM_PbomChangeActivity', '5,7,70,251,753,761', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 2, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define_edit WHERE CCLSID = 754; IF VN = 0 THEN insert into plm_cls_define_edit (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (754, 750, 'EbomChangeIssue', null, null, 'ECI', 'EBOM问题报告', 'PLM_EbomChangeIssue', '5,7,70,251,750,754', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 1, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define_edit WHERE CCLSID = 755; IF VN = 0 THEN insert into plm_cls_define_edit (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (755, 750, 'PbomChangeIssue', null, null, 'PCI', 'PBOM问题报告', 'PLM_PbomChangeIssue', '5,7,70,251,750,755', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 2, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define_edit WHERE CCLSID = 756; IF VN = 0 THEN insert into plm_cls_define_edit (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (756, 751, 'EbomChangeRequest', null, null, 'ECR', 'EBOM变更申请', 'PLM_EbomChangeRequest', '5,7,70,251,751,756', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 1, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define_edit WHERE CCLSID = 757; IF VN = 0 THEN insert into plm_cls_define_edit (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (757, 751, 'PbomChangeRequest', null, null, 'PCR', 'PBOM变更申请', 'PLM_PbomChangeRequest', '5,7,70,251,751,757', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 2, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define_edit WHERE CCLSID = 758; IF VN = 0 THEN insert into plm_cls_define_edit (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (758, 752, 'EbomChangeOrder', null, null, 'ECO', 'EBOM变更指令', 'PLM_EbomChangeOrder', '5,7,70,251,752,758', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 1, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define_edit WHERE CCLSID = 759; IF VN = 0 THEN insert into plm_cls_define_edit (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (759, 752, 'PbomChangeOrder', null, null, 'PCO', 'PBOM变更指令', 'PLM_PbomChangeOrder', '5,7,70,251,752,759', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 2, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define_edit WHERE CCLSID = 760; IF VN = 0 THEN insert into plm_cls_define_edit (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (760, 753, 'EbomChangeActivity', null, null, 'ECA', 'EBOM变更活动', 'PLM_EbomChangeActivity', '5,7,70,251,753,760', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 3, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; SELECT COUNT(1) INTO VN FROM plm_cls_define_edit WHERE CCLSID = 761; IF VN = 0 THEN insert into plm_cls_define_edit (CCLSID, CPCLSID, CCLSNAME, CCLSEXECNAME, CCLSSHORTHANDNAME, CCLSSIGN, CNAME, CTABLENAME, CPATH, CSTATE, CLEVEL, CREMARK, CICONID, CISSUBSIDIARY, CISHARD, CCANINSTANTIATION, CENCODEUNIQUE, CVERSION, CMASTERCLSID, CREVISIONCLSID, CREVISION, CRESERVE, CLIFEMODELID, CVERRULEID, CIFTIMEVALID, CIFBATCHVALID, CIFSEQVALID, CDOMAINID, CISLEAFCLS, CCODEPROPID, CUNIQUERANGE, CCODERULEID, CHASCOPY, CPARTVIEWID, CBOMUSAGECLSID, CUSEPARTVIEW, CTYPE, CDISPLAYED, CUI_DISPLAYED, CIS_SUPPORT_WORKFLOW, CIS_SUPPORT_PERMISSION, CIS_SUPPORT_ASSOCIATION, CIS_SUPPORT_GLOBAL_QUERY, CSCHEMEID, CAPPLICATION_TYPE, CSUPPORT_VALIDITY, CINDEX, CIS_DISPLAYED_IN_FOLDER, CIS_SUPPORT_ATTACHMENT, CIS_SUPPORT_NEWVERSION, CATTACHNUM, CVEREXCEPT, CVERPREFIX, CSERVICE, CREVISIONNUM, CREVISIONRULE) values (761, 753, 'PbomChangeActivity', null, null, 'PCA', 'PBOM变更活动', 'PLM_PbomChangeActivity', '5,7,70,251,753,761', 1, null, null, null, 0, 1, 1, null, 0, null, null, null, 1, null, null, null, null, null, 0, 0, null, null, null, 0, 0, 0, 1, null, null, null, null, null, null, null, null, 0, null, 2, 1, 1, null, 999, null, null, ',7900,', null, 1); END IF; COMMIT; END; /
05-17
### PLM系统中EBOM和PBOM变更管理的表定义及数据初始化 在产品生命周期管理(PLM)系统中,工程物料清单(EBOM, Engineering Bill of Materials)和工艺物料清单(PBOM, Process Bill Of Materials)是核心组成部分。为了支持EBOM和PBOM的变更管理,需要设计一系列数据库表来跟踪变更请求、审批状态、变更历史以及其他相关活动。以下是基于SQL脚本的设计方案。 --- #### 数据库表设计 ##### 1. 变更申请表 (`Change_Request`) 该表用于记录所有的变更请求信息。 ```sql CREATE TABLE Change_Request ( Request_ID INT PRIMARY KEY AUTO_INCREMENT, Title VARCHAR(255) NOT NULL, Description TEXT, Created_By INT NOT NULL REFERENCES User(User_ID), Created_Date DATETIME DEFAULT CURRENT_TIMESTAMP, Status ENUM('Draft', 'Submitted', 'Approved', 'Rejected') DEFAULT 'Draft', BOM_Type ENUM('EBOM', 'PBOM') NOT NULL -- 表明变更涉及 EBOM 或 PBOM ); ``` ##### 2. 变更指令表 (`Change_Order`) 该表用于记录批准后的变更指令及其执行情况。 ```sql CREATE TABLE Change_Order ( Order_ID INT PRIMARY KEY AUTO_INCREMENT, Request_ID INT UNIQUE NOT NULL REFERENCES Change_Request(Request_ID), Issued_By INT NOT NULL REFERENCES User(User_ID), Issued_Date DATETIME DEFAULT CURRENT_TIMESTAMP, Execution_Status ENUM('Pending', 'In Progress', 'Completed') DEFAULT 'Pending' ); ``` ##### 3. 变更活动日志表 (`Change_Activity_Log`) 该表用于记录每次变更的具体操作细节。 ```sql CREATE TABLE Change_Activity_Log ( Log_ID INT PRIMARY KEY AUTO_INCREMENT, Order_ID INT NOT NULL REFERENCES Change_Order(Order_ID), Activity_Description TEXT NOT NULL, Performed_By INT NOT NULL REFERENCES User(User_ID), Perform_Date DATETIME DEFAULT CURRENT_TIMESTAMP ); ``` ##### 4. 物料版本控制表 (`Part_Version_Control`) 该表用于追踪物料的不同版本及其与变更的关系。 ```sql CREATE TABLE Part_Version_Control ( Version_ID INT PRIMARY KEY AUTO_INCREMENT, Part_Number VARCHAR(50) NOT NULL, Version_Number DECIMAL(5, 2) NOT NULL, Effective_Date DATE NOT NULL, Obsolete_Date DATE, Associated_Change_Order INT REFERENCES Change_Order(Order_ID), UNIQUE (Part_Number, Version_Number) ); ``` ##### 5. BOM结构表 (`BOM_Structure`) 该表用于存储当前有效的EBOM/PBOM结构。 ```sql CREATE TABLE BOM_Structure ( Structure_ID INT PRIMARY KEY AUTO_INCREMENT, Parent_Part_Number VARCHAR(50) NOT NULL, Child_Part_Number VARCHAR(50) NOT NULL, Quantity_Per_Parent DECIMAL(10, 3) NOT NULL, BOM_Type ENUM('EBOM', 'PBOM') NOT NULL, Effective_Version INT REFERENCES Part_Version_Control(Version_ID), FOREIGN KEY (Parent_Part_Number) REFERENCES Parts(Part_Number), FOREIGN KEY (Child_Part_Number) REFERENCES Parts(Part_Number) ); ``` ##### 6. 零件基础信息表 (`Parts`) 该表用于存储零件的基础属性。 ```sql CREATE TABLE Parts ( Part_Number VARCHAR(50) PRIMARY KEY, Name VARCHAR(255) NOT NULL, Category VARCHAR(100), Manufacturer VARCHAR(100), Specification TEXT ); ``` --- #### 初始数据加载 以下是一些示例SQL语句,展示如何向上述表格中插入初始数据。 ##### 插入零件基本信息 ```sql INSERT INTO Parts (Part_Number, Name, Category, Manufacturer, Specification) VALUES ('PART001', 'Engine Block', 'Mechanical', 'ABC Corp.', 'High-performance engine block'); ``` ##### 创建一个新的变更请求 ```sql INSERT INTO Change_Request (Title, Description, Created_By, BOM_Type) VALUES ('Update Engine Specifications', 'Modify the specifications of PART001 to support higher RPMs', 101, 'EBOM'); ``` ##### 将变更请求转化为变更指令 ```sql INSERT INTO Change_Order (Request_ID, Issued_By) SELECT Request_ID, 102 FROM Change_Request WHERE Request_ID = 1 AND Status = 'Approved'; ``` ##### 记录变更活动 ```sql INSERT INTO Change_Activity_Log (Order_ID, Activity_Description, Performed_By) VALUES (1, 'Updated specification field for PART001', 103); ``` ##### 更新物料版本 ```sql INSERT INTO Part_Version_Control (Part_Number, Version_Number, Effective_Date, Associated_Change_Order) VALUES ('PART001', 2.0, '2023-09-01', 1); ``` ##### 修改BOM结构 ```sql UPDATE BOM_Structure SET Effective_Version = (SELECT Version_ID FROM Part_Version_Control WHERE Part_Number = 'PART001' AND Version_Number = 2.0) WHERE Child_Part_Number = 'PART001'; ``` --- ### 总结 通过上述表结构设计和SQL脚本,可以有效地管理和追溯EBOM和PBOM的变更过程。这种设计方案不仅涵盖了变更申请、审批、执行的历史记录,还提供了详细的物料版本控制能力[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贺筱钰Maude

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值