Database design UML类属性基数:至少有一个,但不是没有

Database design UML类属性基数:至少有一个,但不是没有,database-design,xsd,uml,Database Design,Xsd,Uml,我有一个类,它存储了一些来自照片EXIF的必需数据。要求中有以下选项: 我需要聚焦35mm胶片 或(FocalLength和focalPlaneResolution和focalPlaneResolution) 它将对应于SQL语句: create table Photo( /* Whatever */ FocalLengthIn35mmFilm FLOAT null, FocalLength FLOAT null, FocalPlaneXResolution FLOAT null

我有一个类,它存储了一些来自照片EXIF的必需数据。要求中有以下选项:

我需要
聚焦35mm胶片
或(
FocalLength
focalPlaneResolution
focalPlaneResolution

它将对应于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模式类似于


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

您只需包含如下约束:

注:

  • 您宁愿使用
    !=Null
    或类似值,使其成为布尔表达式。我只是复制了你的SQL语法
  • 我没有包括所有属性
  • 约束也可以写在OCL中,这使得它更正式(对于坚持这样做的人)。然而,我的OCL仍然不是那么流利,我可以写得很好

正如@Thomas Kilian所建议的, OCL是一种形式化UML约束的干净方法,它将是:

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