根据业务逻辑拆分表

1 sql-server-2008 database-design

这主要是一个设计问题,我正在寻找有关此方法优缺点的任何反馈。

通常,我将数据库设计分为两类,业务逻辑和记录数据。业务逻辑是那些为记录的数据带来意义的东西。例如,PartSerialNumber 是有意义的,因为我们有带有序列号的部件。

所以我会创建一个像......

CREATE TABLE PartsTable
{
    PartID INT, -- NOT NULL IDENTITY PK...
    PartSerialNumber VARCHAR(20), -- NOT NULL
    CreateDate DATE, -- NOT NULL, maybe default
    -- other stuff related to the specific part
}

 -- this is a business logic table, the codes have meaning to the business
CREATE TABLE ErrorCodes
{
    ErrorCode VARCHAR(5), -- NOT NULL, PK
    ErrorDescription VARCHAR(MAX),
    -- OTHER STUFF FOR THE ERROR CODES
}
Run Code Online (Sandbox Code Playgroud)

然后我们有一个日志系统来捕捉错误,

CREATE TABLE PartErrors
{
    PartID INT , -- NOT NULL FK to PartsTable
    ErrorCode VARCHAR(5) -- NOT NULL, SEARCHED ON, FK to Business logic table
    ErrorDate DATE -- NOT NULL, when the error occurred, SEARCHED ON
    -- other search terms
}
Run Code Online (Sandbox Code Playgroud)

现在,有关于每个错误的附加信息,但不会搜索这些信息;可能类似于发生错误时部件的时钟频率。

那么我会创建另一个表

CREATE TABLE PartErrorsData
{
    PartID INT, -- not null, fk to PartsErrors
    ErrorCode VARCHAR(5), -- NOT NULL FK TO PARTSERRORS
    ErrorDate DATE, -- not null FK to PartsErrors
    ClockFrequencyHz INT, -- this may be null if the logger could not read the freq
    MachineNumber INT -- may be null if the logger cannot comm with the machine
    -- maybe other stuff, again, nothing that is searched upon, nor in the BL
}
Run Code Online (Sandbox Code Playgroud)

所以问题是:分离这些表有什么好处,还是我应该简单地将 PartErrorsData 表中的所有列放入 PartsErrors 表中?

似乎我们可以通过在搜索字段上的附加索引来实现这一点。在搜索字段上使用索引和从数据字段中破坏搜索字段之间,我有点左右为难。

重要的是要记住,搜索表上的字段是业务逻辑字段;它们与包含 BL 的表相关。数据表是非常自由的形式,只是记录反馈文件中的值。

我个人喜欢这种方法,因为它清楚地定义了 BL 如何与数据相关联,以便我们可以在必要时加入其他表。例如,如果有另一个系统有 Error 相关的数据,我们可以将它加入 PartErrors 表,而不必担心数据,只需 BL。

编辑:更新表,使复合键是唯一的。这是原始问题的错误。当然,它必须具有与错误实例相关联所需的所有数据。

回应第一个答案的另一个注释。我们有 [至少] 3 个不同错误数据的表。

某些部分可能会提供时钟频率和机器 ID。其他部件可能会报告部件周围的温度、进入部件的电压等。

因此,使用一个表将在该部件未报告的所有字段中具有 NULL。

对于对业务没有意义的数据,时钟频率没有该部分就没有意义。记录机制记录的值可能有错误。也许我们记录的频率为 100Hz,但它应该是 100MHz。该100没有,直到我们把它带到光与BL意义。这部分有一个以 MHz 为单位的时钟。

但是,值 00-139-228-AA 对企业来说是一个零件编号,因此会立即注意到错误记录的零件编号 &&^%%,因为它与 BL 不相关。错误的值不是可捕获的错误。

usr*_*usr 5

我无法想象任何对业务没有价值的数据。如果它没有价值,为什么要存储它?甚至技术日志也具有商业价值(“如果我们没有这些日志,修复错误的成本就会高出 50%”)。

拆分表有几个正当理由:

  • 对冷热数据进行分区以提高缓存效率
  • 列太多(> 1000 左右)
  • 许多列几乎总是为空

但是,不确定通过分层关注点分离数据会获得什么。一切都变得更难理解和维护(并不容易)。

我的建议显然是只有一张桌子。不要人为地拆分数据。