Upload
bertha-heitkamp
View
106
Download
0
Embed Size (px)
Citation preview
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
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“
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
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
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
...
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
• PCK_AUTHORISATION• PCK_COMPOSITIONPATH• PCK_ELEMENT• PCK_EXCEPTION• PCK_LOCKING• PCK_META• PCK_NAMESPACEPATH• PCK_RELATION• PCK_VALIDATOR
stored procedures - packages
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
OMSDataOMSElement
Exception
OMSMetaDataException
OMSStructuremeta
+ ComplexAttribute+ Datatype+ DatatypeEnumeration+ Namespace+ OMSMetaData+ OMSMetaDataException+ Scheme+ SimpleAttribute
Exception
OMSStructureException
OMSRightsgrantedTo
omsCube core Klassen
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
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
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
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.
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
OmsManager
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
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
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
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;
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
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
• 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
• 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
Wähle immer die Technologie, die am besten Deinen Anforderungen und
Bedürfnissen entspricht
There is no silver bullet
Fazit
• 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