@startuml


Instance "1" -down-|>  "1" ModelSubscription

Asset .right.. AssetSubscription

Status ..right.. Instance

Model ..right... ModelSubscription

Asset "1" ...> "n" Model : "Space Point"
Asset "1" ...> "n" Status : "Time x Space"
Model "1" ...> "n" Status : "Time Point"



ModelSubscription "n" -right-|> "1" ModelPublication

ModelPublication "1" --|>  "1" Extension
ModelPublication "1" --|>  "n" Intension

Extension "1" --right--|> "n" Intension

AssetPublication "1" -down-|> "1" Instance

AssetSubscription "n" -right-> "1" AssetPublication



class Asset #FFFFFF {
    Subject owner_id // a_subscriber_id
    Subject visitor_id
    ---
    Model model
    Status status
    ---
    DateTime view_time
}

class Status #FFFFFF {
    Subject owner_id // m_subscriber_id
    Namespace m_sub_group
    Namespace m_sub_name
    ---
    Instance[] instances
    ---
    DateTime track_time
}

class Model #FFFFFF {
    Subject provider_id
    string pub_set_hash
    string root_ext_id
    ---
    Namespace ext_group
    Namespace ext_name
    ---
    Stability stability
    Version semantic
    Visibility visibility
}

class AssetSubscription {
    string id
    ---
    Subject subscriber_id
    string a_sub_set_hash // a_pub_set_hash
    ---
    Namespace group
    Namespace name
    Tracking tag
    ---
    Subject operator_id
    DateTime begin_time
    DateTime end_time
}

class AssetPublication{
    string id
    ---
    string pub_set
    string ins_id
    string m_sub_id
    ---
    Subject owner_id
    Stability stability
    Version semantic
    Visibility visibility
    ---
    Subject operator_id
    DateTime begin_time
    DateTime end_time
}



class Extension {
    string id // ext_id
    ---
    Subject owner_id
    Namespace group
    Namespace name
    Tracking tree
    Visibility visibility
    ---
    Subject operator_id
    DateTime begin_time
    DateTime end_time
}

class Intension {
    string id // int_id
    ---
    string ext_id
    string field
    Boolean single
    Structure structure
    string ref_ext_id
    Visibility visibility
    Boolean required
    ---
    Subject operator_id
    DateTime begin_time
    DateTime end_time
}

class ModelPublication {
    string id // pub_id
    ---
    string m_pub_set_hash
    string ext_id
    string int_id
    ---
    Subject provider_id
    Stability stability
    Version semantic
    Visibility visibility
    ---
    Subject operator_id
    DateTime begin_time
    DateTime end_time
}

class ModelSubscription {
    string id // sub_id
    ---
    Subject subscriber_id
    string m_sub_set_hash // m_pub_set_hash
    ---
    Namespace group
    Namespace name
    Tracking tag
    ---
    Subject operator_id
    DateTime begin_time
    DateTime end_time
}

class Instance {
    string id // ins_id
    Subject owner_id
    string sub_id
    string ext_id
    string int_id
    Namespace field
    string value
    string value_set_hash
    string value_ref_path
    Reference type
    ---
    Subject operator_id
    DateTime begin_time
    DateTime end_time
}




enum Namespace {
    GROUP
    NAME
    FIELD
}
enum Reference {
    DIRECT
    REVIEW
}

enum Stability {
    SNAPSHOT
    RELEASE
}
enum Structure {
    REFERENCE
    NUMBER
    STRING
    BOOLEAN
    DATETIME
}
enum Subject {
    OWNER
    PROVIDER
    SUBSCRIBER
    VISITOR     // read only
    OPERATOR    // read&write
}
enum Tracking {
    TREE
    TAG
}
enum Version {
    SEMANTIC
}
enum Visibility {
    PRIVATE
    PROTECTED
    PUBLIC
}



@enduml



