lox
lox

Reputation: 1622

Person name structure in separate database table

I am wondering when and when not to pull a data structure into a separate database table when it appears in several tables.

I have pulled the 12 attribute address structure into a separate table because I have a couple of different entities containing a single address in this format.

But how about my 3 attribute person name structure (given, middle, surname)?

Should this be put into its own table referenced with a foreign key for all the entities containing a name... e.g. the company table has a contact person name, the citizen table has a person name etc.

Are these best left as attributes in the main tables or should they be extracted?

Upvotes: 4

Views: 2732

Answers (8)

Brian MacKay
Brian MacKay

Reputation: 32019

I would usually keep the address on the Person table, unless there was an unusual need for absolutely uniform addresses on each entity, or if an entity could have an arbitrary number of addresses, or if addresses need to be shared between entities, or if it was a large enterprise product where I know I have to invest in infrastructure all over the place or I will end up gutting everything down the road.

Having your addresses in a seperate table is interesting because it's flexible, but in the context of a small project lacking a special need like the ones mentioned above, it's probably a slight waste. Always be aware of the balance between complexity and flexibility. Flexibility is important, but be discriminating... It's easy to invest way too much there!

In concrete terms, the times that I experimented with (for instance) one-to-one relationships for things like addresses, I ended up refactoring them back into the table because it introduced a bunch of headaches including more complex queries, dealing with situations where the address does not exist, etc. More entities also increases your cognitive load -- it makes the project harder to think about. In my case, it was an unecessary cost because there was no concrete need and, in truth, not even a gain in flexibility.

So, based on my experiences, I would "try" to keep the addresses in the same table, and I would definitely keep the names on them - again, unless there was a special need.

So to paraphrase Einstein, make it as simple as possible and no simpler. But in the short term, experiment. It's the best way to learn these lessons.

Upvotes: 1

cssmaniac
cssmaniac

Reputation: 713

You should really consider your whole database structure and do a ER diagram (entity relationship diagram) first. OF COURSE there should be another table called "Person" where the concept of a person is stored...

Upvotes: 0

ascotan
ascotan

Reputation: 1684

Depends on what you're using the database for.

If you want fast queries on your tables you should de-normalize your tables. Having to run multiple JOIN's will take longer and make your queries more complex.

On the other hand if your intention is to have a flexible storage database which is not meant to be hit with a ton of fast-response queries, then normalizing the tables by splitting them out into multiple xref'ed tables will provide more flexibility in your design and reduce the need for submitting duplicated data.

Since de-normalization is "optimization", I would suggest you normalize the tables first, index them properly and see if you're getting any bottlenecks on your queries. If so, flatten the affected tables where needed.

Upvotes: 0

Philip Kelley
Philip Kelley

Reputation: 40309

As a counterpoint to the other (entirely valid) replies: within your application's current structure, how likely will it be for a given individual (not just name, the actual "person" -- multiple people could be "John Smith") to appear in more than one table? The less likely this is to happen, the less likely you are to get benefits from normalization.

Another way to think of it is entities. Outside of labels (names), is their any overlap between "customer" entity and an "employee" entity?

Upvotes: 1

Russell Troywest
Russell Troywest

Reputation: 8776

It really depends on the problem you are trying to solve. In general it is probably a good idea to have some sort of 'person' table which holds details of people. However, there are occasions where that is potentially a very bad idea.

One example would be if you are holding details of prescriptions written out to people by a doctor. In some countries it is a legal requirment that the prescription details are held with the name in which they were prescribed NOT the name the person is going under currently. For instance a woman might be prescribed a drug as miss X, but then she gets married and becomes Mrs Y. If you had a person table that was linked to the prescriptions table you would now have the wrong details and would possibly face legal consequences. In that case you would need to probably copy the relevant details of the person into the prescription table, even though this would be duplicating data.

So again - it depends on the problem you are trying to solve. Don't just blindly follow what people consider to be best practices. Understand your data and any issues surrounding it, then try to follow best practices that fit.

Upvotes: 0

blispr
blispr

Reputation: 912

Creating a person entity across your data model will give you this present and future advantages -

  1. The same person occurring as a contact, or individual in different contexts. Saves redundancy.
  2. Info can be maintained and kept current with far-less effort.
  3. Easier to search for a person and identify them - i.e. is it the same John Smith?
  4. You can expand the information - i.e. maintain addresses for this person far more easily.
  5. Programming will be more consistent and debugging will be easier as well.
  6. Moves you closer to a 'self-documenting' system.

Upvotes: 1

DanDan
DanDan

Reputation: 10562

Extract them. Your aim should be to have no repeating data in your database. Read about Normalization

Upvotes: 0

Ed Guiness
Ed Guiness

Reputation: 35247

It's about not repeating information, so you don't want to store the same information in two places when one will do.

Another useful rule of thumb is one entity per table. If you find that one table contains, say, "person" AND "order" then you probably should split those into two tables.

And (putting myself at risk of repeating information...) you might find it helpful to review some database design basics, there are plenty of related questions here on stackoverflow.

Start with these...

What is normalisation?

What is important to keep in mind when designing a database

How many fields is 'too many'?

More tables or more columns?

Upvotes: 1

Related Questions