数据库模式知识边界

时间:2015-03-25 12:34:03

标签: mysql database oop design-patterns

我正在努力弄清楚在哪里提供有关数据库的知识。

例如:

假设我们有一个不同企业的运营商的数据库,他们在不同的州和不同的设备上运作。操作员可以在多个州工作,也可以在几家公司工作,使用不同类型的设备。

所以要建模我的db模型:

Operator table (dni, id)
Company table (name, id)
Equipment table (name, id)
States table (name, id)

和关系表

OpComEq (idOp, idComp, idEq)
OpComSt (idOp, idComp, idSt)

因此,如果我们想要检索运算符,我们必须交叉查询。 如果公司告诉我们某个运营商不再使用它们,我们必须删除该运营商与该公司的所有链接以及状态和设备,并检查是否仍然与该运营商有任何联系(他可能是为另一家公司工作等)如果没有,那么将他从运营商数据库中删除。

我遇到的问题是不知道在数据库类中或在Operator类内部封装这些知识的位置,或者可能是另一个类。

我知道这是一个具体的例子,但这是一个抽象的问题,我打赌已经解决但我无法找到这个的设计模式。你能帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解这个问题,但如果我这样做,则没有解决方案。这个问题众所周知,称为Object-Relational Mismatch(或阻抗)。

在关系数据库中存储数据会产生某些规则 - 例如满足3NF - 这限制了数据的组织方式。使用OOP编写代码会产生不同的约束。这两者导致代码组织和数据组织不匹配。你只需忍受它。

(顺便说一句,如果你想出一个通用的解决方案,请让我们都知道 - 生活会更好!)

答案 1 :(得分:0)

我作为数据库设计师和DBA在这里发言,虽然我也做OOP。作为一名数据库设计师,我只是顺便指出你错过了很多表,而且你的问题更多地与需求不足而不是与OR不匹配有关。

  

因此,如果我们想要检索运算符,我们必须交叉查询。

您可以从包含它的任何表中获取运营商的ID号。如果您还需要运营商的名称,那么您需要加入运营商表。

  

如果公司告诉我们某个运营商不再使用这些运营商,我们必须删除该运营商与该公司所有的状态和设备的所有链接,并检查是否仍有与该运营商的任何链接(他可能正在为另一家公司工作等)如果没有,那么将他从运营商数据库中删除。

绝对不是。

说一句"身份证号为42的运营商目前不在Vandelay,Inc。工作。" (你没有这个事实的表格,但是你应该这样做。)说#34是完全不同的事情;身份证号码42的运营商不再是运营商。 #34;

在第一种情况下,我可能会写一个像这样的删除语句。

-- "The operator who has id number 42 
-- doesn't currently work for Vandelay, Inc."
delete from company_operators
where op_id = 42 and co_id = (select co_id 
                              from companies 
                              where co_name = 'Vandelay, Inc.')

作为一个谨慎的数据库设计师,我已经构建了表来级联删除。因此,应用程序员不必检查任何其他内容或删除任何其他内容。请注意,这不会删除有关哪个设备操作员42可以操作的任何事实,除非该事实与操作员42目前为Vandelay工作的事实直接相关。

在第二种情况下,我可能会写一个这样的删除语句。

-- "The operator who has id number 42 is no longer an operator." 
delete from operators
where op_id = 42;

同样,级联删除会处理其他表。您不必检查任何其他内容或删除任何其他内容。