UML类属性基数:这些中至少有一个但不是没有

时间:2017-09-13 17:29:53

标签: database-design xsd uml

我有一个课程,可以存储摄影EXIF所需的一些数据。需求中有多种选择:

我需要FocalLengthIn35mmFilm 或(FocalLengthFocalPlaneXResolution以及FocalPlaneYResolution)。

它将对应于SQL语句:

create table Photo(
  /* Whatever */
  FocalLengthIn35mmFilm FLOAT null,
  FocalLength FLOAT null,
  FocalPlaneXResolution FLOAT null,
  FocalPlaneYResolution FLOAT null,
  constraint AtLeastOneFocal CHECK (
    FocalLengthIn35mmFilm is not null OR (
        FocalLength is not null AND
        FocalPlaneXResolution is not null AND
        FocalPlaneYResolution is not null
        )
  )
)

xsd架构类似于this answer

我会定义/绘制相应的UML架构,但我不知道如何建模这个“基数选项”。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

你只需要包含这样的约束:

enter image description here

注意:

  • 您宁愿使用!= Null之类的东西来使它成为一个bool表达式。我只是复制了类似SQL的语法。
  • 我没有包含所有属性。
  • 约束也可以写在OCL中,这使得它更正式(对于那些坚持这一点的人)。但是,我的OCL仍然不是那么流利,我可以写得很好。

答案 1 :(得分:1)

正如@Thomas Kilian所说, OCL是一种简洁的方式来形式化UML的这些约束,它将是:

context Photo inv : 
(
self.FocalLengthIn35mmFilm->notEmpty() 
  or (
  self.FocalLenght->notEmpty() and
  self.FocalPlaneXResolution->notEmpty() and
  self.FocalPlaneYResolution->notEmpty()
  )
)