跳转到主要内容
HPO Software 分步式 4D 数据库与低代码应用构建指南 —— 从创建首张表到打造可运行的商业应用。

本站部分链接为联盟营销链接:如果您通过这些链接购买,我们可能会获得佣金,且不会增加您的成本。这绝不会影响我们的推荐建议。详情请参阅我们的联盟披露声明。 联盟营销披露.

4D 数据库教程:完整指南

4D 数据库教程从四个主要对象开始:表、字段、表单和方法。 4D 是 4D SAS 的关系数据库和应用程序开发平台,于 1984 年首次推出,将数据存储在与编译或解释的应用程序层相关的专有“.4DD”结构文件中。开发人员在一个集成环境中定义表、构建表单并附加代码。

4D 在工具领域占据着不寻常的地位。它是关系数据库引擎、快速应用程序开发环境、Web 服务器和低代码表单设计器的组合。这种组合就是小团队采用它的原因:一个产品涵盖存储、业务逻辑、UI 和部署。

该引擎是传统意义上的关系型引擎:表、主键、关联表以及结构中定义的关系。尽管 4D 通过其 SQL 引擎和“开始 SQL”/“结束 SQL”命令支持 SQL,但它不像 PostgreSQL 或 MySQL 那样首先是 SQL。大多数日常任务都使用 4D 自己的语言(历史上称为 4D 语言,现在简称为 4D 代码),它比 SQL 更接近于脚本语言。这种 4d 数据库教程方法可以帮助初学者了解该工具的多功能性。

早期有两个架构事实很重要:

  • 结构与数据。 在现代版本中,结构(表、字段、表单、方法)驻留在“.4DC”/项目文件中;数据位于“.4DD”数据文件中。在 4D 20 及更高版本中,项目存储为文本文件的文件夹,使 Git 的版本控制变得实用。较旧的“.4DB”二进制结构更难以区分。
  • 客户端-服务器与单用户。 单用户部署在一台计算机上运行所有内容。客户端-服务器将 4D 服务器(数据 + 业务逻辑)与 4D 客户端(UI)分开。相同的结构支持两者,但网络往返改变了编写循环的方式。

如果您来自 Microsoft Access,则思维模型可以很好地转移。如果您来自网络堆栈,则需要忘记一些习惯:4D 表单 是有状态且事件驱动的,而不是请求响应。

第 1 步:安装并创建您的第一个结构

从官方 4D 网站 (4d.com) 下载 4D,开始本 4D 数据库教程。您通常会选择 4D(完整开发环境)和 4D Server 进行部署。有一个免费的本地开发模式可供学习,但部署到生产需要许可证:直接检查当前的许可证条款,因为它们随着版本的不同而变化。

Related: — The long-running for teams that need custom apps on desktop, web, and mobile from a single file..

创建项目:

  1. 启动 4D 并选择 新建 > 项目。
  2. 为项目命名并选择一个文件夹。 现代 4D 创建一个包含“Project/Sources/”的项目文件夹,并将您的结构作为文本文件。
  3. 结构编辑器打开。这是您的原理图画布。

结构编辑器是您添加表格的地方。每个表都有一个名称、一组字段以及一个自动生成的主键(可选)。 4D 的约定是按类型为字段名称添加前缀 — ID_、Name_、Date_、Amount_ — 尽管这是风格问题而不是要求。当您扫描 200 个字段时,一致性会在稍后得到回报。

您最常使用的字段类型:文本、Alpha、整数、长整型、实数、日期、时间、布尔值、图片、BLOB、对象和 UUID。 Object 类型存储类似 JSON 的结构化数据,是灵活属性的现代选择。 UUID 字段是新表的推荐主键类型,因为它们避免了分布式或合并数据中自动递增整数的冲突和重新编号问题。

Our pick: — A spreadsheet-simple interface sitting on top of a real relational database, with automations, views, and shareable interfaces..

步骤 2:设计表和关系

4D 中的模式设计遵循关系规范化规则,具有 4D 特有的特殊性:关系以图形方式声明并涉及自动行为。这是任何 4d 数据库教程的关键部分。

要创建关系,请在结构编辑器中将主键字段从一个表拖动到另一个表的外键字段。 4D 绘制关系线并允许您配置:

关系设定它控制什么实际效果
自动关系4D是否自动加载相关记录方便表单;可能会导致循环中的隐藏查询
一对多与多对一链接方向确定哪一方持有外键
相关表名代码中的访问器名称成为您引用的属性,例如[发票]客户
删除控制级联、限制或置空防止孤儿记录

一个具体的例子:一个“Invoice”表,其中一个“CustomerID”字段链接到“Customer.ID”。在代码中,“[Invoice]Customer.Name”沿着关系访问。这很优雅,但在超过 10,000 张发票的循环中却很危险,因为每次访问都可以触发查找。解决方法是故意使用“RELATE MANY”/“RELATE ONE”,或者首先将相关数据加载到集合中。

妥协以尽早做出决定: 具有声明关系的规范化表为您提供引用完整性和简单的代码,但在大量读取时会降低性能。具有嵌入对象字段的非规范化表读取速度更快,但会将完整性检查推送到您自己的代码中。对于小型团队的大多数业务应用程序,规范化事务核心并对报告表进行非规范化。

步骤 3:构建表单

表单是 4D 的用户界面层,有多种类型:详细信息表单(一条记录)、列表表单(多条记录)、输入表单、输出表单和项目表单(未链接到表格)。表单编辑器是一个带有属性列表的拖放画布。这是任何 4d 数据库教程的关键部分。

创建表单时的关键概念:

Related: — A builder aimed at portals, directories, and internal tools — with flat-rate pricing instead of per-user fees..

  • 数据源。 每个表单都链接到一个表,或链接到项目表单的变量/表达式。
  • 小部件。 字段、按钮、复选框、下拉列表、列表框和分层列表。列表框是显示相关数据的主力,比简单的网格功能强大得多。
  • 对象方法。 右键单击​​任何对象并附加方法。该方法在“加载时”、“单击时”、“数据更改时”和“验证时”等事件上运行。
  • 表单方法。 表单本身有一个用于表单级别事件的方法,例如“加载时”和“卸载时”。

客户详细信息表单的便捷模板:放置客户字段,添加链接到该客户的发票选择的列表框,然后放置一个执行创建新发票方法的按钮。列表框选择是查询或关系驱动的,插入后刷新它可以使 UI 保持同步。

警告: 4D 表单是有状态的。表单包含当前记录和当前选择。对于新手来说,将表单级状态与后台进程混合在一起是最常见的令人困惑的错误来源。将长时间运行的作业保留在单独的进程中并将结果发布回来。

第四步:编写方法和业务逻辑

在这个 4D 数据库教程中,4D 代码被分解为多个方法,这些方法有多个版本:

Reader favorite: — Enterprise-grade low-code app development wired into Microsoft 365, Dataverse, and Power Automate..

  • 数据库方法 — 由数据库事件触发(启动、关闭、备份)。
  • 表方法 — 由记录事件触发(保存时、删除时)。
  • 表单和对象方法 — 由 UI 事件触发。
  • 项目方法 — 您的可重用函数,可从任何地方调用。
  • 触发器:在记录操作之前/之后执行操作,非常适合审计跟踪。

现代 4D 代码支持类和“This”关键字,允许您编写面向对象的代码而不仅仅是过程代码。最小的项目方法如下所示:

// 项目方法:CreateInvoice
// $1 = 客户 ID (UUID)

C_OBJECT($invoice)
$invoice:=ds.Invoice.new()
$invoice.CustomerID:=$1
$invoice.Date:=当前日期
$invoice.Status:="草稿"
$status:=$invoice.save()

ds 对象(数据存储)是通过 ORDA(对象关系数据访问)引入的现代 ORM 样式访问层。 ORDA 允许您使用实体和实体选择而不是传统选择,并支持查询链接、计算属性和客户端实体选择,从而减少服务器往返次数。对于新开发项目,ORDA是推荐路线; “QUERY”和“CREATE RECORD”等经典命令仍然有效并出现在旧代码库中。

如何决定: 将 ORDA 用于新代码以及任何从可读和可链接查询中受益的内容。在需要对大量选择进行非常紧密的循环的地方保留经典命令,因为经典选择在某些服务器端场景中可以提高内存效率。衡量而不是假设。

步骤 5:值列表、查询和报告

值列表使用一组受控选项填充下拉列表和列表框。 4D 支持多种类型的列表:

  1. 静态列表 — 硬编码值,非常适合状态和标志。
  2. 表格列表 — 从参考表中提取的值,非常适合客户、产品和类别。
  3. 分层列表 — 父/子值,对于科目表或类别树很有用。

对于查询,ORDA 的“query()”接受带有占位符的公式字符串,这避免了注入问题并且读起来清晰:

$sel:=ds.Invoice.query("状态 = :1 AND 日期 >= :2"; "打开"; $startDate)

4D 报告使用 Quick Report 编辑器进行简单的表格输出,并使用 4D Write Pro 区域进行丰富的文档。 Write Pro 是嵌入表单中的文字处理对象;您可以将数据合并到模板中并将其导出为 PDF 或 DOCX 格式。对于任何复杂的事情,生成 HTML 并将其呈现到 Web 区域通常可以更快地创建并且更容易设置样式。 4d 数据库教程的这一部分到此结束。

步骤 6:部署和维护

在这个 4d 数据库教程中,部署选项塑造您的架构:

  • 单用户:单台计算机上的应用程序和数据。最简单,没有并发。
  • 客户端-服务器 — 4D服务器包含数据和业务逻辑; 4D 客户端连接。非常适合 LAN 团队。
  • 4D Web 服务器 — 4D 直接为 REST 端点和网页提供服务。 ORDA 公开对数据存储的自动 REST 访问,这意味着您可以在同一架构上创建 Web 界面。
  • 4D for iOS / Android — 从您的结构生成的移动客户端。

备份是内置的:4D Server 可以安排自动备份并维护日志(日志文件)以进行时间点恢复。在上线之前而不是之后启用日志。在数据副本上测试恢复:未经测试的备份只是一种希望,而不是计划。

版本控制:在项目模式下的结构中,将“Project/Sources/”文件夹提交到 Git。排除数据文件和“DerivedData”文件夹。这是对二进制时代的真正改进,值得从第一天起就采用。

常见错误以及如何避免它们

跳过主键规则。 每个表都需要一个稳定且唯一的主键。 UUID 避免了删除或合并记录时因自动递增整数而导致的重新编号问题。

**将业务逻辑放入表单方法中。**表单方法应该处理用户界面。将规则移至项目方法或类中,以便 Web 端点、导入和计划任务可以重用它们。

忽略日志。 如果没有它,写入时发生崩溃可能会导致数据文件不一致。打开它。

循环关系。 在大循环内访问“[Table]Related.Field”会增加查询。使用 ORDA 预加载或使用“RELATE MANY”一次。

像 SQL 一样对待 4D。 您可以使用 SQL,但 4D 惯用代码通常更短,并且与表单和事件集成得更好。作为 4d 数据库教程的一部分,首先学习原生语言。

学习路径和资源

从官方 4D 文档和 4D 开发人员博客开始,其中涵盖 ORDA、Write Pro 和特定于版本的更改。 4D 社区论坛很活跃,对具体问题反应良好。对于无论平台如何都适用的关系设计基础知识,有关关系数据库和 SQL 条目的维基百科文章提供了有关查询规范化和语义的有用信息。

一个现实的学习顺序:创建一个单表联系人管理器,然后添加一个相关表和列表框,然后添加一个值列表和一个查询表单,然后部署一个客户端服务器。每一步都会引入一个新概念,但不会让您不知所措。

要点

  • 4D 将关系数据库、IDE、表单设计器和 Web 服务器结合在一个产品中,适合需要快速交付自定义业务应用程序的小型团队。这个 4d 数据库教程强调了它的效率。
  • 在结构编辑器中定义表和关系,在表单编辑器中创建屏幕,并通过方法和触发器附加逻辑:构成每个 4D 应用程序的四个对象。
  • ORDA(ds,实体,实体选择)是现代数据访问层,也是新代码的推荐选择;经典命令在遗留项目中仍然有效。
  • 使用 UUID 主键,启用日志,并从一开始就将项目模式结构提交到 Git,以避免以后的痛苦迁移。
  • 将业务逻辑与表单方法分离并预加载相关数据,而不是在大循环内遍历关系。

资料来源和进一步阅读

  • 关系数据库 — 维基百科:关系数据库 (RDB) 是基于数据关系模型的数据库,由 E. F. Codd 于 1970 年提出。关系数据库管理系统 (RDBMS…

常见问题

4D 是 SQL 数据库吗?

4D是一个关系数据库,拥有自己的原生语言和集成的SQL引擎。您可以通过“Begin SQL”/“End SQL”发出 SQL 语句,但大多数 4D 开发使用 ORDA 或经典 4D 命令而不是 SQL。底层模型是关系模型(表、键和关系),因此 SQL 概念同样适用,即使您每天编写的语法有所不同。

我需要了解编程才能使用 4D 吗?

基本的编程知识非常有用,因为表单和业务规则都链接到 4D 代码。也就是说,4D 的内置表单编辑器和向导允许您使用最少的代码创建功能性数据输入应用程序。公民开发人员通常从表单和值列表开始,然后学习自定义行为所需的方法。对于初学者来说,4d 数据库教程可能会有所帮助。

ORDA 和经典 4D 命令有什么区别?

ORDA 是一个面向对象的访问层,围绕数据存储 (ds)、实体和实体选择构建,具有可链接查询和对客户端选择的支持。 “QUERY”、“CREATE RECORD”和“MODIFY SELECTION”等经典命令适用于经典选择和当前记录。 ORDA 是新开发的推荐方法,而经典命令在旧代码库中仍然很常见。

4D 应用程序可以在 Web 或移动端运行吗?

是的。 4D 包括内置 Web 服务器,ORDA 可以通过数据存储公开 REST 接口,因此浏览器前端可以与相同的架构进行通信。 4D 还提供适用于 iOS 和 Android 的移动客户端生成。权衡是 Web 和移动客户端必须密切关注身份验证和每个请求返回的数据量。

如何安全备份 4D 数据库?

在 4D Server 中启用日志(日志文件),以便您可以恢复到某个时间点并安排自动备份,而不是依赖手动副本。在真正发生紧急情况需要恢复之前,请务必先测试数据副本的恢复。将结构与数据文件分开进行版本控制,因为它们以不同的速率变化。

4D 适合小型企业应用程序吗?

4D 正是针对这种场景而设计的:一个小团队使用表单、报告和关系模式创建自定义业务应用程序。它可以扩展到客户端-服务器部署和 Web 访问,而无需更改核心结构。主要考虑因素是许可成本以及与主流 Web 技术栈相比较小的人才库,因此必须权衡长期维护和构建速度。

Frequently asked questions

4D是SQL数据库吗?

4D是一个关系数据库,有自己的母语和集成的SQL引擎。您可以通过 Begin SQL / End SQL 发出 SQL 语句,但大多数 4D 开发使用 ORDA 或经典 4D 命令而不是 SQL。底层模型是关系模型(表、键和关系),因此 SQL 概念会迁移,即使您每天编写的语法不会迁移。

我需要了解编程才能使用 4D 吗?

基本的编程知识非常有用,因为表单和业务规则都链接到 4D 代码。也就是说,4D 的内置表单编辑器和向导允许您使用最少的代码创建功能性数据输入应用程序。公民开发人员通常从表单和值列表开始,然后学习自定义行为所需的方法。对于初学者来说,4d 数据库教程可能会有所帮助。

ORDA 和经典 4D 命令有什么区别?

ORDA 是一个围绕数据存储 (ds)、实体和实体选择构建的面向对象的访问层,具有可链接查询并支持客户端选择。诸如 QUERY、CREATE RECORD 和 MODIFY SELECTION 等经典命令适用于经典选择和当前记录。 ORDA 是新开发的推荐方法,而经典命令在旧代码库中仍然很常见。

4D 应用程序可以在网络或移动设备上运行吗?

是的。 4D 包括内置 Web 服务器,ORDA 可以通过数据存储公开 REST 端点,因此浏览器前端可以与相同的架构进行通信。 4D 还提供适用于 iOS 和 Android 的移动客户端生成。权衡是 Web 和移动客户端必须密切关注身份验证和每个请求返回的数据量。

如何安全备份 4D 数据库?

在 4D Server 中启用日志(日志文件),以便您可以恢复到某个时间点并安排自动备份,而不是依赖手动副本。在紧急情况下需要数据副本之前,请务必先测试数据副本的恢复。将结构与数据文件分开进行版本控制,因为它们以不同的速率变化。

4D 适合小型企业应用程序吗?

4D 正是针对这种场景而设计的:一个小团队使用表单、报告和关系模式创建自定义业务应用程序。它可以扩展到客户端-服务器部署和 Web 访问,而无需更改核心结构。主要考虑因素是许可成本以及与主流网络堆栈相比较小的人才库,因此必须权衡长期维护和构建速度。


Try Power Apps Free with Your Work Account

Enterprise-grade low-code app development wired into Microsoft 365, Dataverse, and Power Automate.