# #2389 Database Schema review, FKs, null/not null columns etc... ``` USE alkemio; SELECT CONCAT('FK_', SUBSTRING(MD5(RAND()), 1, 27)); -- Change a few columns to NOT NULLABLE ALTER TABLE challenge CHANGE nameID nameID VARCHAR(36) NOT NULL; ALTER TABLE hub CHANGE nameID nameID VARCHAR(36) NOT NULL; ALTER TABLE hub CHANGE visibility visibility VARCHAR(255) NOT NULL DEFAULT ''; ALTER TABLE opportunity CHANGE nameID nameID VARCHAR(36) NOT NULL; ALTER TABLE location CHANGE city city VARCHAR(255) NULL DEFAULT NULL; ALTER TABLE location CHANGE country country VARCHAR(255) NULL DEFAULT NULL; ALTER TABLE activity CHANGE triggeredBy triggeredBy CHAR(36) NOT NULL; ALTER TABLE activity CHANGE resourceId resourceId CHAR(36) NOT NULL; ALTER TABLE activity CHANGE collaborationId collaborationId CHAR(36) NOT NULL; -- Change a few column types: ALTER TABLE aspect CHANGE nameID nameID VARCHAR(36) NOT NULL; ALTER TABLE project CHANGE nameID nameID VARCHAR(36) NOT NULL; ALTER TABLE canvas CHANGE nameID nameID VARCHAR(36) NOT NULL; ALTER TABLE organization CHANGE nameID nameID VARCHAR(36) NOT NULL; ALTER TABLE user CHANGE nameID nameID VARCHAR(36) NOT NULL; ALTER TABLE aspect CHANGE displayName displayName VARCHAR(255) NOT NULL; ALTER TABLE aspect CHANGE type type varchar(255) NOT NULL; ALTER TABLE aspect_template CHANGE type type text NOT NULL; ALTER TABLE preference_definition CHANGE displayName displayName varchar(128) NOT NULL; ALTER TABLE preference_definition CHANGE definitionSet definitionSet varchar(128) NOT NULL; -- Moderate danger: -- Add some missing FKs -- PreferenceSet ALTER TABLE challenge DROP CONSTRAINT FK_c07b5b4c96fa89cb80215827668; ALTER TABLE challenge ADD CONSTRAINT FK_c890de5a08d363719a41703a638 FOREIGN KEY (preferenceSetId) REFERENCES preference_set(id) ON DELETE SET NULL; ALTER TABLE hub ADD CONSTRAINT FK_6bf7adf4308991457fdb04624e2 FOREIGN KEY (preferenceSetId) REFERENCES preference_set(id) ON DELETE SET NULL; ALTER TABLE organization ADD CONSTRAINT FK_c07b5b4c96fa89cb80215827668 FOREIGN KEY (preferenceSetId) REFERENCES preference_set(id) ON DELETE SET NULL; ALTER TABLE user ADD CONSTRAINT FK_5ea996d22fbd9d522a59a39b74e FOREIGN KEY (preferenceSetId) REFERENCES preference_set(id) ON DELETE SET NULL; ALTER TABLE canvas ADD CONSTRAINT FK_c7b34f838919f526f829295cf86 FOREIGN KEY (previewId) REFERENCES visual(id) ON DELETE SET NULL; -- AuthorizationId ALTER TABLE aspect ADD CONSTRAINT FK_00a8c330495ef844bfc6975ec89 FOREIGN KEY (authorizationId) REFERENCES authorization_policy(id) ON DELETE SET NULL; -- Dangerous: -- Change length of a few column types: ALTER TABLE canvas CHANGE displayName displayName VARCHAR(255) NOT NULL; ALTER TABLE user CHANGE serviceProfile serviceProfile BOOLEAN NOT NULL; -- Better not do this: -- ALTER TABLE callout CHANGE nameID nameID VARCHAR(36) NOT NULL; -- ALTER TABLE activity CHANGE description description VARCHAR(128) NOT NULL; -- ALTER TABLE activity CHANGE type type VARCHAR(16) NOT NULL; ``` Inconsistency: striked through a comment about changing id columns to varchar - most of the id columns are are varchar, but I think they all should be changed to binary or to char anyway - [x] Agent - [x] Credential - [x] Collaboration - [x] Challenge * ~~<Check manually> Challenge childChallenges Missing FK on table challenge column ChallengeId to challenge.id~~ (ParentChallengeId is ok) * Missing FK on column preferenceSetId to preference_set.id - [x] Hub * ~~<Check manually> Hub challenges Missing FK on table challenge column HubId to hub.id~~ (ParentHubId is ok) * Missing FK on column preferenceSetId to preference_set.id - [x] Agreement - [x] CardProfile * ~~Column id is char(36) but is expected to be: varchar(36)~~ - [ ] Aspect * Column nameID is char(36) but is expected to be: varchar(36) * Column displayName is char(255) but is expected to be: varchar(255) * ~~Entity:Aspect table:aspect property:type column:type Expected type:text but has type:char~~ I think it should be just varchar and remove this param from the decorator **CONFIRM!!** * Missing FK on column authorizationId to authorization_policy.id - [ ] Callout * ~~NameID column doesn't match in callout [ { prop: 'character_maximum_length', value: 255, expected: 36 }, { prop: 'column_type', value: 'varchar(255)', expected: 'varchar(36)' } ]~~ **better don't change this** - [x] Opportunity * NameID column doesn't match in opportunity [ { prop: 'column_default', value: 'NULL', expected: null }, { prop: 'is_nullable', value: 'YES', expected: 'NO' } ] - [x] Project * NameID column doesn't match in project [ { prop: 'column_default', value: 'NULL', expected: null }, { prop: 'is_nullable', value: 'YES', expected: 'NO' } ] - [x] Relation - [x] AuthorizationPolicy - [x] CanvasCheckout * ~~Column id is char(36) but is expected to be: varchar(36)~~ - [x] Canvas * ~~Column id is char(36) but is expected to be: varchar(36)~~ displayName column doesn't match in canvas [ { prop: 'data_type', value: 'text', expected: 'varchar' }, { prop: 'character_maximum_length', value: 65535, expected: 255 }, { prop: 'column_type', value: 'text', expected: 'varchar(255)' } ] * Column nameID is char(36) but is expected to be: varchar(36) * Missing FK on column previewId to visual.id - [x] Lifecycle - [ ] Location * ~~Column id is char(36) but is expected to be: varchar(36)~~ * **CONFIRM THE NEXT TWO ONES!!** * Entity:Location table:location property:city column:city Expected Nullable:true but has:NO * Entity:Location table:location property:country column:country Expected Nullable:true but has:NO - [x] NVP - [x] Preference * ~~Column id is char(36) but is expected to be: varchar(36)~~ - [ ] PreferenceDefinition * ~~Column id is char(36) but is expected to be: varchar(36)~~ * displayName column doesn't match in preference_definition [ { prop: 'character_maximum_length', value: 128, expected: 255 }, { prop: 'column_type', value: 'varchar(128)', expected: 'varchar(255)' } ] - **Wrong in the entity** * Entity:PreferenceDefinition table:preference_definition property:definitionSet column:definitionSet Expected Length:128 but has:32 * prop preference should be of type array if the relation is OneToMany **CONFIRM, CODE IN THE ENTITY IS WRONG??** - [x] PreferenceSet ~~Column id is char(36) but is expected to be: varchar(36)~~ - [x] Reference - [x] Tagset - [x] Visual * ~~Column id is char(36) but is expected to be: varchar(36)~~ - [x] Comments * ~~Column id is char(36) but is expected to be: varchar(36)~~ - [x] Communication * ~~Column id is char(36) but is expected to be: varchar(36)~~ - [ ] Discussion * ~~Column id is char(36) but is expected to be: varchar(36)~~ * Entity:Discussion table:discussion property:createdBy column:createdBy Expected type:varchar but has type:char **CONFIRM: This entity has 'varchar' type in typeorm but I think it should be char, and it should have createdByUserId or some Id suffix if it's a char(36) or a varchar(36)** - [x] Updates ~~Column id is char(36) but is expected to be: varchar(36)~~ - [x] Application ~~Unknown related entities Application questions~~ Many to Many checker not well implemented ~~<Check manually> ManyToMany relation { entityName: 'Application', manyToManyDecorator: { name: 'ManyToMany', documentation: '', type: 'any', parameters: [ [Object], [Object], [Object], [Object] ], rawValue: 'ManyToMany(() => NVP, nvp => nvp.id, { eager: true, cascade: true })' } }~~ Checked, all good - [x] CommunityPolicy - [x] Community ~~Unknown related entities Community applications IApplication is not a valid entity~~ OK Checked manually - [x] OrganizationVerification ~~Column id is char(36) but is expected to be: varchar(36)~~ - [x] Profile - [x] Organization * NameID column doesn't match in organization [ { prop: 'column_default', value: 'NULL', expected: null }, { prop: 'is_nullable', value: 'YES', expected: 'NO' } ] * Missing FK on column preferenceSetId to preference_set.id - [x] User * NameID column doesn't match in user [ { prop: 'column_default', value: 'NULL', expected: null }, { prop: 'is_nullable', value: 'YES', expected: 'NO' } ] * Column type mismatch: serviceProfile (boolean) Column serviceProfile (tinyint(4)) * Missing FK on column preferenceSetId to preference_set.id - [x] UserGroup - [x] Actor - [x] ActorGroup - [x] Context - [x] EcosystemModel - [x] TemplateInfo * ~~Column id is char(36) but is expected to be: varchar(36)~~ - [x] AspectTemplate * ~~Column id is char(36) but is expected to be: varchar(36)~~ * templatesSet OnDelete policies don't match NO ACTION CASCADE **CONFIRM: This is wrong in the typescript code** * Entity:AspectTemplate table:aspect_template property:type column:type Expected type:text but has type:char - [x] CanvasTemplate * ~~Column id is char(36) but is expected to be: varchar(36)~~ * templatesSet OnDelete policies don't match NO ACTION CASCADE **CONFIRM: This is wrong in the typescript code ??** - [x] LifecycleTemplate * ~~Column id is char(36) but is expected to be: varchar(36)~~ * templatesSet OnDelete policies don't match NO ACTION CASCADE **CONFIRM: This is wrong in the typescript code ??** - [x] TemplatesSet * ~~Column id is char(36) but is expected to be: varchar(36)~~ - [x] Library * ~~Column id is char(36) but is expected to be: varchar(36)~~ - [x] InnovationPack * ~~Column id is char(36) but is expected to be: varchar(36)~~ - [ ] Activity * collaborationID needs to be renamed to collaborationId **Code is wrong in typescript** * Entity:Activity table:activity property:triggeredBy column:triggeredBy Expected Nullable:false but has:YES * Entity:Activity table:activity property:resourceID column:resourceID Expected Nullable:false but has:YES * Entity:Activity table:activity property:collaborationID column:collaborationID Expected Nullable:false but has:YES * Entity:Activity table:activity property:description column:description Expected Length:128 but has:255 Entity:Activity table:activity property:type column:type Expected Length:16 but has:128 **Done checking** query-result-cache not used by typeorm? application_questions not used by typeorm? migrations_typeorm not used by typeorm? **Done**