Sample Header Ad - 728x90

Should I use composite key or primary key from other table

0 votes
1 answer
1298 views
We have a Education Project which has following entities : - Domain (e.g. Programming, UI/UX, AI, ML), each Domain has 5 Levels (1, 2, 3, 4, 5) - Building Blocks - which are like small topics e.g. java, multi-threading, loops, prototyping, user interviews. Each Level in the Domain is build of multiple Building Blocks. - Learning Asset (is like a link to study a concept - it can be associated with multiple Building Blocks) and further these Learning Assets are mapped to a particular Domain -> Level -> Building Block These are the tables that we have thought of : Domain | id | Name | | 10 | UIUX | | 11 | Programming | | 12 | AI | Building Blocks | id | Name | | 1 | loops | | 2 | multi-threading | | 3 | user-interview | Then we store mapping of Building Blocks to a Domain - Level Domain-Level-BuildingBlocks Mapping Table | DLB_Id | domainId | level | buildingBlockId | 100 | 11 | 1 | 1 | 200 | 11 | 2 | 2 | 300 | 10 | 1 | 3 in this table - (domainId, level, buildingBlockId) form a composite key Learning Asset Table | id | Name | link | 1 | Loop Notes | https://a.com | 2 | Operators | https://b.com | 3 | Process and Threads | https://c.com A Learning Asset can be connected to multiple building blocks Learning Asset -BuildingBlocks Mapping Table | id | learningAssetId | buildingBlockId | 1 | 1 | 1 | 2 | 2 | 1 | 3 | 3 | 2 Now the Admin can select if a Learning Asset is applicable in Domain-Level-BuildingBlock combination so Learning Asset-Domain-Level-BuildingBlocks Mapping Table **(Table A)** | id | learningAssetId | domainId | level | buildingBlockId | 1 | 1 | 11 | 1 | 1 | 2 | 2 | 11 | 1 | 1 in this table - (domainId, level, buildingBlockId) form a composite key My question was in the above table : should I again store **(domainId, level, buildingBlockId)** or should I use their primary key **DLB_id** from the **Domain-Level-BuildingBlocks table** something like this : Learning Asset-Domain-Level-BuildingBlocks Mapping Table **(Table B)** | id | learningAssetId | DLB_Id | 1 | 1 | 100 | 2 | 3 | 200 1. My question is whether to use Table A or Table B 2. If Table B is the correct way should I generate DLB_Id as string by combining domainId + "-" + level + "-" + buildingBlockId instead of using Auto-increment Integet Primary Keys. Will the indexing on the generated string be as efficient as the Auto-increment Integer Primary Key. The reason for generating the string is that when we need to fetch the Learning Assets that belong to a Domain-Level-BuildingBlock combination I don't need to use the Domain-Level-BuildingBlocks Mapping Table - rather I can directly look up the generated string Id in the Learning Asset-Domain-Level-BuildingBlocks Mapping Table Learning Asset-Domain-Level-BuildingBlocks Mapping Table **(Table C)** | id | learningAssetId | DLB_Id (as generated string) | 1 | 1 | '11-1-1' | 2 | 3 | '11-2-2' i.e. Table B or Table C ? Thank you
Asked by j10 (309 rep)
Jul 25, 2021, 07:41 AM
Last activity: Jul 25, 2021, 04:17 PM