I am currently designing a contact management database for a chamber of commerce. The goal of the database is to store all the person (except our own staff), all recorded companies (regular companies and member of the chamber), addresses of the person and companies, tasks that the staff are currently responsible for, a list of our staff (user) and the roles within the chamber.
person
works for one company
company
have multiple person
person
and company
can have multiple address
company
can be in multiple industry
industry
can have multiple company
company
can have multiple membertype
membertype
can have multiple company
user
can play multiple role
role
can be assigned to mutliple user
user
can have multiple task
task
can be worked on by multiple user
task
can target multiple person
person
can be targeted by multiple task
person
can only be added by one user
user
can add multiple person
company
can have 0 or 1 parent_company
parent_company
can have multiple child companyI have come up with the following design and it has undergone some changes:
user-task-person
relationship?person
can have only one email
but can have multiple tel
, should I make an extra table just for tel
while email
is still in the person
table? Would it considered to be "unclean"?membertype
, should company_id
and typename
both be PK?I'm a newbee at database, there are definitely some design flaws or errors, it would be nice if you guys could give me some suggestions so that I can correct and improve this design. Thank you ^~^
The main issue I see is that while all primary keys are defined as Int some foreign keys or references are defined as varchar.
Also role_id is length 10 while all other primary keys are 11.
Personally I would prefer capitalised table names, User, Company etc
Update for the edited version:
You might want to create a table for phone, mail,fax etc say contact_info
that could contain a string field holding the contact info and a type field (email, phone, fax,...). This way you could store several phone numbers for instance, if you want to limit email to one you could either leave it in the person
table and not allow it here or have a business rule to only allow one email row in contact_info
.
This table could also be useful for company
if you want to store email or phone numbers for the company
like contact@somecompany.com or the number to the company switchboard
For the table membertype, should company_id and typename both be PK?
Yes
Second update
About the address solution:
Shouldn't the address
table contain enough info to make each address unique, I can understand that a company can have more than one address but should it allowed for two companies to have the same address (by that I mean the same row in the database) so maybe it should be changed to a one-to-many from company
and ´address´ but a one-to-one in the other direction.
I also think it could be good to have some kind of label in the two address-link tables so one can easily identify an address like "home", "work", "Office", "Warehouse"...