My comments intermixed below :-)
Stuart Felenstein <[EMAIL PROTECTED]> wrote on 09/01/2004 12:30:19 PM:
> While I currently have about a dozen tables, I'd like
> to throw this one up for any opinions, suggestion,
> warnings, things I may not be saying. It's not a
> started entity - schema diagram but should be clear
> for the purposes of the email.
>
> "Table: Posts" (innodb)
> ------------------------------------------
> PostID (auto inc, int) set to PK
> ------------------------------------------
> Entered (timestamp)
> ------------------------------------------
> StartP (timestamp) (user decision)
> ------------------------------------------
> PLen (Int) (user decision)
> ------------------------------------------
> VenID (int) (Not FK'd to the VenTable though, don't
> see the need) Session variables and joins keeping them
> related
> -------------------------------------------
> Ind (varchar) based on user choice from menu provides
> IndID from static table
so call this IndID. As a matter of personal preference (very personal) I
name my FK fields (even if I don't actually create a FK to enforce the
relationship) like "tablename_columnname". So I would call it Ind_ID (or
whatever your other table is called)
> -----------------------------------------
> City - (varchar) based on user choice from menu
> provides CitID from static table
and this CitID or City_ID
> -------------------------------------------
> State - (varchar) based on user choice from menu
> provides StatID from static table
ditto: StatID (State_ID?)
> ---------------------------------------------
> Term - (varchar) based on user choice from menu
> provides TermID from static table
ditto: TermID (Term_ID?). However, wouldn't you need to support multiple
terms per posting? This would be a situation where normalization requires
you to split this value into its own table like:
CREATE TABLE Posts_Terms (
Posts_PostID int,
Term_ID int,
Primary Key(Posts_PostID, Term_ID),
KEY(Term_Id)
) TYPE=InnoDB, COMMENT 'This table holds a list of terms used to
identify a post for searches'
The multi-column primary key will prevent any single "term" from being
applied more than once to any one "post". The second index would speed up
searches to find which "post"s are associated with specific "term"s.
> ------------------------------------------
> Rate - (varchar) User text input
> ----------------------------------
> Contact - (varchar) right now they are pulled dynamic
> fields from the Ven Table, defaulted into form for
> Posts and put into this table
??? - I have no clue what the Ven table has in it or how you defined
fields that change their data types and defaults ("dynamic fields" ?) so
your comment makes less than no sense to me. Don't confuse your web/UI
design with your data design. They may be symbiotic but they are
definitely NOT the same.
> --------------------------------------------
> Contact Email - (varchar) same as above - I'm starting
> to see an issue here, meaning, possible bad design),
> My strategy was that one company may have an account
> with various users sharing the one contact name and
> password. Not sure.
??? - again I can't understand the context of your comment. I know from
previous messages to the list that you are working on a job seekers web
site but you don't seem to have a well defined idea of "who" needs to know
"what" about "whom".
> --------------------------------------------
> One more insignificant field.
>
so why mention that you have it? If it is truly insignificant, don't add
it to the table.
.......
May I suggest that you temporarily stop development and go through a bit
of basic object modelling? Start by defining the different users (also
known by the UML term "actors") of your system and what you want them to
be able to do. I think I can name 3 but you may have more: JobSeekers,
EmployeeSeekers, and Administrators (please create your OWN names that
better fit YOUR business model).
A JobSeeker is someone who wants to be found by a EmployeeSeeker.
They will want their profile/resume/CV to be accurate, online, and
searchable.
EmployeeSeekers are those people who want to find people
(JobSeekers) they can hire to fill certain positions. They need to be able
to search all of the profile/resume/CV(s) of the JobSeekers on your site
and initiate contact with them if they meet their hiring criteria.
Administrators are superusers (like you) who need to be able to
change anything about everything associated with the site. Most of what an
Administrator needs to do will probably be accomplished through off-site
(not-web-based) methods like direct editing of your data tables using
MySQL tools and scripts. However, you may want to develop certain
web-based tools to help with list management (terms, cities, states, etc)
and other related processes (like creating and disabling JobSeeker
logins). The trade-off to consider is "will a little time invested in
building a web page for "process x" save me lots of time compared to doing
this by hand (over and over)?".
........
Just from my basic, simply-worded text description, you can start to get a
picture of not only what data you need to store (and maybe what not to
store), but also what features and processes your site needs to support,
what processes your data structures need to support, and where your
current prototype design may be lacking. I have identified (or implied
through my description)not _only_ a few actors but some objects (JobSeeker
account, profile/resume/CV,...), and several processes (Add "profile" to
system, Edit a "profile", Make a "profile" available for searching, etc).
Take the time early on (like now) to flush out the vast majority of the
details of your "application" using this kind of text-based design
description. Keep your process descriptions broad and simple at first:
"JobSeekers need to be able to: Login, Add resumes, Edit existing resumes,
Post resumes, Remove posted resumes,...." You can go back and add the
details during later revisions. When it comes time to describe your
business objects (data storage), the more detailed you can be about what
information each object contains (again, start with broad descriptions and
refine through later revisions) the less time you will need to spend
during the development phase creating and revising your database design.
For example, what qualities an EmployeeSeeker would think a JobSeeker
needs to have in order to be eligible for a certain job is probably NOT
something you need to keep in your database. Those would be the terms they
will use to search by, right? This would be object information (a
"SearchQuery" or other usefully named object) that you process and handle
through your UI and convert to SQL queries against your database but store
it there. Similar (but not the same) information would be necessary to put
into your database if you decide that you are also keeping lists of
JobOpenings (another object I had not previously considered). So now you
need to consider if you need to design something to hold JobOpenings in
your database or you could decide that that is a future feature and ignore
it until you have time to work on it.
See how working this business process out on paper BEFORE you start coding
can save you lots of real time when it becomes time to actually create the
database and write the code that supports it? You won't spend nearly as
much time second-guessing what you need the database to support because
you already thought it through on paper.
Keep us in the loop. This is turning into a wonderful teaching situation
and you will probably get loads of free help (on the data design at least)
as it's all going to help many others on the list, too.
Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine