26
omsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

Embed Size (px)

Citation preview

Page 1: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

omsCube

Objektverwaltung, basierend auf einem relationalen

Datenbankmanagementsystem

Page 2: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

Wichtigkeit von Persistenz• Persistenz ist eine der wichtigsten

Funktionalitäten in Businessanwendungen• In vielen Anwendungen bilden die

Datenbankoperationen einen großen Teil des Sourcecodes

• Die Daten werden länger genutzt als die Anwendungen, die die Daten erzeugt haben

• Performance von Datenbankoperationen hat entscheidende Rolle in der Anwendungsperformance

Page 3: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

Persistenz-Lösungen

• RDBMS – relational database management systems– Problem: object-relational impedance mismatch

• ODBMS – object database management systems

• ORDBMS – object/relational database management systems

• Andere Lösungen– flat files, XML, „in memory“

Page 4: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

CLOBVALUE

ASSOCIATION

AUTHORISATION

AUTINDEX

BLOBVALUE

COMPLEXATTRIBUTE

COMPOSITION

DATATYPE DATATYPEENUMERATION

ELEMENT

EXCEPTION

LOCKING

NAMESPACE

OMSVERSION

SCHEME

SIMPLEATTRIBUTE

AUTROOT

OMSCONFIG

OMSLOG

UNIQUEVALUESIMPLEVALUE

1

omsCube E/R Diagramm

Page 5: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

omsCube Metadaten

COMPLEXATTRIBUTE

CAT_ID: NUMBER(38)CAT_SOURCE_SCM_ID: NUMBER(38)CAT_TARGET_SCM_ID: NUMBER(38)CAT_NAME: VARCHAR2(1024)CAT_RELATIONTYPE: CHAR(1)CAT_MINMULTIPLICITY: NUMBER(8)CAT_MAXMULTIPLICITY: NUMBER(8)CAT_CREATING_ELM_ID: NUMBER(38)CAT_MODIFYING_ELM_ID: NUMBER(38)CAT_CREATINGDATE: DATECAT_MODIFYINGDATE: DATE

DATATYPE

DAT_ID: NUMBER(38)DAT_NSP_ID: NUMBER(38)DAT_NAME: VARCHAR2(1024)DAT_TYPE: VARCHAR2(50)DAT_VALUETYPE: CHAR(1) = 's'DAT_CREATING_ELM_ID: NUMBER(38)DAT_MODIFYING_ELM_ID: NUMBER(38)DAT_CREATINGDATE: DATEDAT_MODIFYINGDATE: DATE

DATATYPEENUMERATION

DEN_ID: NUMBER(38)DEN_DAT_ID: NUMBER(38)DEN_VALUE: VARCHAR2(1024)DEN_USE: CHAR(1)DEN_CREATING_ELM_ID: NUMBER(38)DEN_MODIFYING_ELM_ID: NUMBER(38)DEN_CREATINGDATE: DATEDEN_MODIFYINGDATE: DATE

NAMESPACE

NSP_ID: NUMBER(38)NSP_PARENT_NSP_ID: NUMBER(38)NSP_NAME: VARCHAR2(1024)NSP_PATH: VARCHAR2(4000)NSP_CREATING_ELM_ID: NUMBER(38)NSP_MODIFYING_ELM_ID: NUMBER(38)NSP_CREATINGDATE: DATENSP_MODIFYINGDATE: DATE

SCHEME

SCM_ID: NUMBER(8,2)SCM_PARENT_SCM_ID: NUMBER(38)SCM_NSP_ID: NUMBER(38)SCM_NAME: VARCHAR2(50)SCM_ABSTRACT: CHAR(1) = '0'SCM_CREATING_ELM_ID: NUMBER(38)SCM_MODIFYING_ELM_ID: NUMBER(38)SCM_CREATINGDATE: DATESCM_MODIFYINGDATE: DATE

SIMPLEATTRIBUTE

SAT_ID: NUMBER(38)SAT_SCM_ID: NUMBER(38)SAT_DAT_ID: NUMBER(38)SAT_NAME: VARCHAR2(1024)SAT_DEFAULTVALUE: VARCHAR2(4000)SAT_DEN_USE: CHAR(1) = '0'SAT_CREATING_ELM_ID: NUMBER(38)SAT_MODIFYING_ELM_ID: NUMBER(38)SAT_CREATINGDATE: DATESAT_MODIFYINGDATE: DATE

Page 6: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

omsCube Daten

ASSOCIATION

ASS_ID: NUMBER(38)ASS_CAT_RELATIONTYPE: CHAR(1) = 'a'ASS_KEY: VARCHAR2(1024)ASS_CAT_ID: NUMBER(38)ASS_SOURCE_ELM_ID: NUMBER(38)ASS_TARGET_ELM_ID: NUMBER(38)ASS_SIBLING_ORDER: NUMBER(38)ASS_CREATING_ELM_ID: NUMBER(38)ASS_MODIFYING_ELM_ID: NUMBER(38)ASS_CREATINGDATE: DATEASS_MODIFYINGDATE: DATE

CLOBVALUE

CVL_ID: NUMBER(38)CVL_VALUE: CLOBCVL_VALUETYPE: CHAR(1) = 'c'CVL_ELM_ID: NUMBER(38)CVL_DAT_ID: NUMBER(38)CVL_DEN_ID: NUMBER(38)CVL_SAT_ID: NUMBER(38)CVL_CREATING_ELM_ID: NUMBER(38)CVL_MODIFYING_ELM_ID: NUMBER(38)CVL_CREATINGDATE: DATECVL_MODIFYINGDATE: DATE

COMPOSITION

CMP_ID: NUMBER(38)CMP_CAT_RELATIONTYPE: CHAR(1) = 'c'CMP_CAT_ID: NUMBER(38)CMP_SOURCE_ELM_ID: NUMBER(38)CMP_TARGET_ELM_ID: NUMBER(38)CMP_KEY: VARCHAR2(1024)CMP_SIBLING_ORDER: NUMBER(38)CMP_PATH: VARCHAR2(4000)CMP_LEVEL: NUMBER(38)CMP_CREATING_ELM_ID: NUMBER(38)CMP_MODIFYING_ELM_ID: NUMBER(38)CMP_CREATINGDATE: DATECMP_MODIFYINGDATE: DATE

ELEMENT

ELM_ID: NUMBER(38)ELM_SCM_ID: NUMBER(38)ELM_SCM_ABSTRACT: CHAR(1) = '0'ELM_BOOKMARK: VARCHAR2(1024)ELM_DISPLAYNAME: VARCHAR2(1024)ELM_VALID: NUMBER(1) = 0ELM_CREATING_ELM_ID: NUMBER(38)ELM_MODIFYING_ELM_ID: NUMBER(38)ELM_CREATINGDATE: DATEELM_MODIFYINGDATE: DATE

SIMPLEVALUE

SVL_ID: NUMBER(38)SVL_VALUE: VARCHAR2(4000)SVL_VALUETYPE: CHAR(1) = 's'SVL_ELM_ID: NUMBER(38)SVL_DAT_ID: NUMBER(38)SVL_DEN_ID: NUMBER(38)SVL_SAT_ID: NUMBER(38)SVL_CREATING_ELM_ID: NUMBER(38)SVL_MODIFYING_ELM_ID: NUMBER(38)SVL_CREATINGDATE: DATESVL_MODIFYINGDATE: DATE

UNIQUEVALUE

UVL_ID: NUMBER(38)UVL_VALUE: VARCHAR2(4000)UVL_VALUETYPE: CHAR(1) = 'u'UVL_ELM_ID: NUMBER(38)UVL_DAT_ID: NUMBER(38)UVL_DEN_ID: NUMBER(38)UVL_SAT_ID: NUMBER(38)UVL_CREATING_ELM_ID: NUMBER(38)UVL_MODIFYING_ELM_ID: NUMBER(38)UVL_CREATINGDATE: DATEUVL_MODIFYINGDATE: DATE

BLOBVALUE

BVL_ID: NUMBER(38)BVL_VALUE: BLOBBVL_VALUETYPE: CHAR(1) = 'b'BVL_ELM_ID: NUMBER(38)BVL_DAT_ID: NUMBER(38)BVL_DEN_ID: NUMBER(38)BVL_SAT_ID: NUMBER(38)BVL_CREATING_ELM_ID: NUMBER(38)BVL_MODIFYING_ELM_ID: NUMBER(38)BVL_CREATINGDATE: DATEBVL_MODIFYINGDATE: DATE

Page 7: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

...

FUNCTION createElement( p_displayName IN VARCHAR2, p_bookmark IN VARCHAR2, p_scm_Id IN NUMBER, p_creating_elm_Id IN NUMBER

) RETURN NUMBER;

FUNCTION updateElement( p_elm_Id IN NUMBER, p_displayName IN VARCHAR2, p_bookmark IN VARCHAR2, p_modifying_elm_Id IN NUMBER

) RETURN NUMBER;

FUNCTION cloneElementAppend( p_elm_Id IN NUMBER, p_target_elm_id IN NUMBER, p_target_cat_id IN NUMBER, p_target_key IN VARCHAR, p_recursive IN NUMBER, p_cloneAssociations IN NUMBER, p_creating_elm_Id IN NUMBER

) RETURN NUMBER;

FUNCTION removeElementRecursive( p_elm_Id IN NUMBER, includeSelf IN NUMBER, removeAssociations IN NUMBER

) RETURN NUMBER;

PROCEDURE moveCompositionBefore( p_cmp_Id in number, p_before_cmp_Id IN NUMBER, p_modifying_elm_Id in number );

...

stored procedures - Beispiel

Page 8: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

• PCK_AUTHORISATION• PCK_COMPOSITIONPATH• PCK_ELEMENT• PCK_EXCEPTION• PCK_LOCKING• PCK_META• PCK_NAMESPACEPATH• PCK_RELATION• PCK_VALIDATOR

stored procedures - packages

Page 9: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

Architektur

Datenbank (Oracle, SQL Server)

omsCube Datenmodel

Datenbankprozeduren

core Klassen (Java, PHP, C#)

OmsManager

OQL

AnwendungomsCube

omsCube- kommerziell

omsCube- in Planung

Met

adat

enM

etad

aten

Page 10: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

OMSDataOMSElement

Exception

OMSMetaDataException

OMSStructuremeta

+ ComplexAttribute+ Datatype+ DatatypeEnumeration+ Namespace+ OMSMetaData+ OMSMetaDataException+ Scheme+ SimpleAttribute

Exception

OMSStructureException

OMSRightsgrantedTo

omsCube core Klassen

Page 11: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

OMSData

+ OMSData()+ getDataSource() : DataSource+ getMetaData() : OMSMetaData+ getUserId() : int+ getOMSStructureByWhere() : OMSStructure+ getOMSStructureByResource() : OMSStructure+ saveOMSStructure() : OMSStructure+ executeOnResource() : CallResult[]+ reloadMetaData() : void+ loadRights() : void+ loadRights() : void+ getLockKey() : String+ lockElement() : String+ lockStructure() : void+ unlockByKey() : void+ unlockById() : void+ isElementLocked() : boolean+ cloneElement() : String+ removeElementRecursive() : int

OMSElement

+ getId() : String+ getBookmark() : String+ getDisplayName() : String+ getValue() : Object+ getCreater() : String+ getCreatingDate() : Date+ getModifier() : String+ getModifyingDate() : Date+ getNamespacePath() : String+ getSchemeName() : String+ isNew() : boolean+ isRemoved() : boolean+ isUpdated() : boolean+ getOMSStructure() : OMSStructure+ getParent() : OMSElement+ getJoinedElements() : OMSElement[]+ getJoiningElements() : OMSElement[]+ setId() : void+ setBookmark() : void+ setValue() : void+ setDisplayName() : void+ compose() : void+ compose() : void+ compose() : void+ associate() : void+ associate() : void+ associate() : void+ disconnect() : void+ getRightsList() : OMSRights[]+ getRights() : OMSRights+ addRights() : void+ removeRights() : void+ removeAllRights() : void+ getKey() : String+ getJoinedElementByKey() : OMSElement+ move() : void+ move() : void

Exception

OMSMetaDataException

OMSStructure

+ OMSStructure()+ getRootElement() : OMSElement+ getElements() : OMSElement[]+ createElement() : OMSElement+ getElementById() : OMSElement+ getElementByBookmark() : OMSElement+ merge() : void

meta

+ ComplexAttribute+ Datatype+ DatatypeEnumeration+ Namespace+ OMSMetaData+ OMSMetaDataException+ Scheme+ SimpleAttribute

Exception

OMSStructureException

OMSRights

+ OMSRights()+ OMSRights()+ canRead() : boolean+ canWrite() : boolean+ canCompose() : boolean+ canAssociate() : boolean+ canDelete() : boolean+ getGrantedTo() : OMSElement+ isRoot() : boolean+ setRead() : void+ setWrite() : void+ setCompose() : void+ setAssociate() : void+ setDelete() : void+ setGrantedTo() : void+ clone() : OMSRights

grantedTo

omsCube core API

Page 12: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

DECLARE v_bookmark element.elm_bookmark%TYPE;v_id element.elm_id%TYPE;v_ids t_array;

BEGIN v_bookmark := :in_string_bookmark;

BEGINselect elm_id into v_id from element where elm_bookmark = v_bookmark;

EXCEPTIONwhen NO_DATA_FOUND then v_id := 0;

END;

SELECT ass_target_elm_id BULK COLLECT INTO v_idsFROM associationWHERE ass_cat_id = :in_int_members_att_idAND ass_source_elm_id = v_id;

OPEN :out_cursor_tree FOR

SELECT *FROM composition, association, element, simplevalue, uniquevalue,

clobvalue,TABLE( CAST( v_ids AS t_array ) ) ids

WHERE cmp_target_elm_id = ids.COLUMN_VALUE AND elm_id = cmp_target_elm_id AND ass_source_elm_id (+)= elm_id AND svl_elm_id (+)= elm_id AND cvl_elm_id (+)= elm_id AND uvl_elm_id (+)= elm_id;END;

Anfragebeispiel

Page 13: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

DAO und Entities

Finder

# store: DataStore = null

+ Finder(DataStore)+ findElementsByParentAttribute(Entity, String, boolean) : OMSElement[]+ findElementById(String, boolean) : OMSElement+ findElementsByIds(String[]) : OMSElement[]+ findElementByGuid(String, boolean) : OMSElement# findElementWithLanguageById(String, String) : OMSElement+ findElementByBookmark(String, boolean) : OMSElement# getMetaData() : OMSMetaData# getStructureByResource(Class, String, HashMap, BoundVariable[]) : OMSStructure# executeCallByResource(Class, String, BoundVariable[]) : CallResult# getCatId(String, String, String) : Integer# getSatId(String, String, String) : Integer

Entity

+ DATE_FORMAT: String = "yyyy-MM-dd HH:...# element: OMSElement = null

+ Entity(OMSElement)# Entity(String, String)# formatDate(Date) : String# parseDate(String) : Date+ getElement() : OMSElement+ delete() : void+ getElementBookmark() : String+ getCreater() : String+ getCreatingDate() : Date+ getElementDisplayName() : String+ getElementId() : String+ getModifier() : String+ getModifyingDate() : Date+ setElementBookmark(String) : void+ setElementDisplayName(String) : void# set(Entity, String, boolean, String) : void# add(Entity, String, boolean, String) : void# remove(Entity, String) : void# removeAll(String) : int+ isNew() : boolean+ isRemoved() : boolean+ isUpdated() : boolean# removeFromAll(String, String, String) : int# contains(String, Entity) : boolean+ getNewEntity(String, OMSElement) : Entity

DataStore

+ DataStore(String, String, int)+ DataStore(DataSource, int)+ DataStore(DataSource, String)+ DataStore(String, String, String)+ DataStore(String, Properties, int)+ DataStore(String, Properties, String)+ DataStore(Properties, int)+ DataStore(Properties, String)+ DataStore(OMSData)+ updateUserIdByBookmark(String) : void+ store(Entity) : void+ commit() : void+ rollback() : void+ getOMSData() : OMSData

#store

Page 14: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

Beispiel – generierte Klassen 1/2

geographic::CountryFinder

+ findAllCountries() : Country[]

geographic::BaseCountryFinder

+ findCountryByGuid() : Country+ findCountryById() : Country+ findCountryByBookmark() : Country+ findCountryArrayByParentAttribute() : Country

geographic::BaseCountry

+ getCode() : String+ getCodeModifyingDate() : Date+ setCode() : void+ getNameDe() : String+ getNameEn() : String+ setNameDe() : void+ setNameEn() : void+ setFkmCode() : void+ getParentContinentArrayByCountries() : Continent+ removeFromAllContinentParentsByCountries() : int+ containsInRegions() : boolean+ getRegions() : Region+ getRegionsLastModifyingDate() : Date+ addRegions() : void+ addRegions() : void+ removeRegions() : void+ removeAllRegions() : int+ containsInLanguages() : boolean+ getLanguages() : Language+ getLanguagesLastModifyingDate() : Date+ addLanguages() : void+ addLanguages() : void+ removeLanguages() : void+ removeAllLanguages() : intgeographic::Country

geographic::Continent

omscube::Language

geographic::Region

getNameXXX methods are generated for each value of the 'name' attribute domain

getParentXXXByXXX methods are use of reflexive relations: return the given (by the name) class objects which compose/associate this object by specified (also by the name) attribute

The method findAllCountries is manually implemented extension.

Page 15: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

Beispiel – generierte Klassen 2/2

geographic::CountryFinder

geographic::BaseCountryFinder

omscube::BaseObjectFinder

omscube::ObjectFinder

org.opencube.oms.mapping::Finder

Finders Entities

geographic::BaseCountry

geographic::Country

omscube::BaseObject

omscube::Object

org.opencube.oms.mapping::Entity

Page 16: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

OmsManager

Page 17: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

Beispiel: Benutzerverwaltung

Object

OrganizationUnit

- roleAbles: RoleAble [0..*]- organizationUnits: OrganizationUnit [0..*]

Profile

- gentle: String- title: LString- firstname: String- middlename: String- lastname: String- mobilePhone: String- division: String- position: LString- profession: LString- department: LString- photo: Binary

Group

- members: Account* [0..*]

Object

Role

- permissions: Permission* [1..*]- roleAbles: RoleAble* [0..*]

Object

RoleAble

Object

Permission

Object

PermissionSet

- permissions: Permission [0..*]- permissionSets: PermissionSet [0..*]

Object

RoleContainer

- permissionSets: PermissionSet [0..*]- roles: Role [0..*]

Account

- code: String- username: String- password: String- email: String- url: String- language: Language- lastLogin: Date- recentPassword: String- addresses: Address [0..*]- contactAddress: Address- preferences: Property [0..*]- optional: String- comment: Text- flags: String = ________- status: String- source: String- sourceId: String

Company

- employees: Profile* [0..*]- name: String- subname: String

Object

Address

- type: String- country: Country*- region: Region*- header1: String- header2: String- main: String- footer: String- zip: String- city: String- poBox: String- poBoxZip: String- phone: String- fax: String- optional: String- comment: Text- flags: String = ________- status: String

Object

geographic::Country

- code: String- name: LString- regions: Region [0..*]- languages: Language* [1..*]

Object

geographic::Region

- name: LString

Object

System::Project

- properties: PropertyProxy [0..*]- applications: Application* [1..*]- environments: Environment* [0..*]- containers: Container* [0..*]- objects: Object* [0..*]

+organizationUnits0..*

0..*

+roleAbles

0..*+roleAbles

0..*

+permissions

0..*

+permissions

+permissionSets0..*+roles

0..*+permissionSets

0..*

+members

0..*

+employees

0..*

+addresses

1

+country

0..1

+region

+regions

+objects

+objects

Page 18: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

Profile getProfile( String username, String password ){

DataStore store = Context.getDataStore();ProfileFinder finder = new ProfileFinder( store );Profile profile =

finder.findProfileWithRolesByLogin( username );store.commit();password = MD5.getHashString( password );if( profile == null ||

!profile.getPassword().equalsIgnoreCase( password ) ){

return null;}return profile;

}

Beispiel – Loginprozedur 1/3

Page 19: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

public Profile findProfileWithRolesByLogin( String loginName ) throws Exception{

Scheme profileScm = getMetaData().getScheme( Profile.NAMESPACE_PATH,Profile.SCHEME_NAME );

BoundVariable[] bindVariables = new BoundVariable[]{

new BoundVariable( "out_cursor_tree", null ), new BoundVariable( "in_string_username", loginName ), new BoundVariable( "in_int_username_att_id",

profileScm.getSimpleAttributeByName( Profile.SAT_USERNAME ).getId() ), new BoundVariable( "in_int_roles_att_id",

profileScm.getComplexAttributeByName( Profile.CAT_ROLES ).getId() ), };OMSStructure tree = getStructureByResource( ProfileFinder.class,

"findProfileWithRolesByLogin.sql", null, bindVariables );OMSElement[] elements = tree.getElements();for (int i = 0; elements != null && i < elements.length; i++)

if( elements[ i ].getNamespacePath().equals( Profile.NAMESPACE_PATH ) && elements[ i ].getSchemeName().equals( Profile.SCHEME_NAME ) )

{return new Profile( elements[ i ] );

}return null;

}

Beispiel – Loginprozedur 2/3

Page 20: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

DECLARE

v_count INTEGER;

v_roles_count INTEGER;

v_profile_id element.elm_id%TYPE;

v_roles_cat_id complexattribute.cat_id%TYPE;

v_cur SYS_REFCURSOR;

BEGIN

v_roles_cat_id := :in_int_roles_att_id;

SELECT MAX( uvl_elm_id ) into v_profile_id

FROM uniquevalue

WHERE uvl_sat_id = :in_int_username_att_id

AND uvl_value = :in_string_username;

IF v_profile_id IS NOT NULL THEN

SELECT count(*) INTO v_roles_count FROM association

WHERE ass_cat_id = v_roles_cat_id

AND ass_source_elm_id = v_profile_id;

IF v_roles_count > 0 THEN

OPEN v_cur FOR

--

ELSE

OPEN v_cur FOR

--

END IF;

ELSE

OPEN v_cur FOR

SELECT * FROM DUAL WHERE ROWNUM = 0;

END IF;

:out_cursor_tree := v_cur;

END;

SELECT * FROM association

JOIN element ON ( elm_id = ass_target_elm_id

OR elm_id = v_profile_id )

LEFT OUTER JOIN simplevalue ON svl_elm_id = elm_id

LEFT OUTER JOIN clobvalue ON cvl_elm_id = elm_id

LEFT OUTER JOIN blobvalue ON bvl_elm_id = elm_id

LEFT OUTER JOIN uniquevalue ON uvl_elm_id = elm_id

WHERE ( ass_cat_id = v_roles_cat_id

AND ass_source_elm_id = v_profile_id ) ;

Beispiel – Loginprozedur 3/3

SELECT * FROM ELEMENT

LEFT OUTER JOIN simplevalue ON svl_elm_id = elm_id

LEFT OUTER JOIN clobvalue ON cvl_elm_id = elm_id

LEFT OUTER JOIN blobvalue ON bvl_elm_id = elm_id

LEFT OUTER JOIN uniquevalue ON uvl_elm_id = elm_id

WHERE elm_id = v_profile_id;

Page 21: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

omsCube Rechte

AUTHORISATION

AUT_ID: NUMBER(38)AUT_SOURCE_ELM_ID: NUMBER(38)AUT_TARGET_ELM_ID: NUMBER(38)AUT_READ: CHAR(1)AUT_WRITE: CHAR(1)AUT_COMPOSE: CHAR(1)AUT_ASSOCIATE: CHAR(1)AUT_DELETE: CHAR(1)AUT_MODIFYINGDATE: DATEAUT_CREATING_ELM_ID: NUMBER(38)AUT_MODIFYING_ELM_ID: NUMBER(38)AUT_CREATINGDATE: DATE

AUTINDEX

AUX_ID: NUMBER(38)AUX_PARENT_ELM_ID: NUMBER(38)AUX_CHILD_ELM_ID: NUMBER(38)

ELEMENT

ELM_ID: NUMBER(38)ELM_SCM_ID: NUMBER(38)ELM_SCM_ABSTRACT: CHAR(1) = '0'ELM_BOOKMARK: VARCHAR2(1024)ELM_DISPLAYNAME: VARCHAR2(1024)ELM_VALID: NUMBER(1) = 0ELM_CREATING_ELM_ID: NUMBER(38)ELM_MODIFYING_ELM_ID: NUMBER(38)ELM_CREATINGDATE: DATEELM_MODIFYINGDATE: DATE

AUTROOT

AUR_ID: NUMBER(38)AUR_ROOT_ELM_ID: NUMBER(38)AUR_CREATING_ELM_ID: NUMBER(38)AUR_MODIFYING_ELM_ID: NUMBER(38)AUR_CREATINGDATE: DATEAUR_MODIFYINGDATE: DATE

Page 22: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

ELEMENT

ELM_ID: NUMBER(38)ELM_SCM_ID: NUMBER(38)ELM_SCM_ABSTRACT: CHAR(1) = '0'ELM_BOOKMARK: VARCHAR2(1024)ELM_DISPLAYNAME: VARCHAR2(1024)ELM_VALID: NUMBER(1) = 0ELM_CREATING_ELM_ID: NUMBER(38)ELM_MODIFYING_ELM_ID: NUMBER(38)ELM_CREATINGDATE: DATEELM_MODIFYINGDATE: DATE

LOCKING

LCK_ID: NUMBER(38)LCK_LOCKER_ELM_ID: NUMBER(38)LCK_LOCKED_ELM_ID: NUMBER(38)LCK_LOCKER_KEY: NUMBER(38)LCK_START_TIME: DATELCK_LAST_UPDATE_TIME: DATELCK_INTERVAL: NUMBER(38)LCK_LOCKER_IP: VARCHAR2(50)LCK_CREATING_ELM_ID: NUMBER(38)LCK_MODIFYING_ELM_ID: NUMBER(38)LCK_CREATINGDATE: DATELCK_MODIFYINGDATE: DATE

omsCube Locking

Page 23: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

• Direkte Abbildung von Businessklassen in der Datenbank

• Leichte Erweiterbarkeit des logischen Datenbankschemas

• Gute Ablage von Baumstrukturen• Gut für Speicherung von vielen unterschiedlichen

Objekten geeignet• Gute Performance von Suchoperationen• Alle Objekte sind auf die selbe Weise in der Datenbank

gespeichert• Nutzt oft bereits vorhandene und gut bekannte

relationale Datenbanken als Basis• Kann mit relationalen Modellen kombiniert werden

Vorteile

Page 24: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

• Komplizierte Abfragen• Anwendungslogik-Klassen sind von der

Datenbankschicht abhängig• Schlechte Unterstützung für verschiedene Datenbanken• Numerische- und Datums-Werte sind als VARCHAR

gespeichert • Schlechtere Performance von Schreiboperationen• Die Technologie ist nicht weit verbreitet

Nachteile

Page 25: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

Wähle immer die Technologie, die am besten Deinen Anforderungen und

Bedürfnissen entspricht

There is no silver bullet

Fazit

Page 26: OmsCube Objektverwaltung, basierend auf einem relationalen Datenbankmanagementsystem

• FINGO: www.fingo.pl– Robert Marek: [email protected]

• Präsentationsfolien: www.fingo.info/omscube/

• omsCube offizielle Seite: www.opencube.org– openCube Verein: [email protected]

Kontakt