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 不相关。错误的值不是可捕获的错误。
我无法想象任何对业务没有价值的数据。如果它没有价值,为什么要存储它?甚至技术日志也具有商业价值(“如果我们没有这些日志,修复错误的成本就会高出 50%”)。
拆分表有几个正当理由:
但是,不确定通过分层关注点分离数据会获得什么。一切都变得更难理解和维护(并不容易)。
我的建议显然是只有一张桌子。不要人为地拆分数据。
归档时间: |
|
查看次数: |
236 次 |
最近记录: |