Greybeard, I'll ask you to bear with me 'cause I'm from Louisiana, where we still have remnants of the Napoleonic code on the books. Where judges don't have to follow precedent, where it can often happen that one person can be convicted of taking a bribe that another person is acquited of making.
But, hey, we've got the best food festivals in the world and beer is cheap.
Back to your problem...
You need to re-visit your analysis. First and foremost, you only have two kinds of case. Billable and pro bono.
Fed vs. state doesn't change the results. That's just an address for the court room. Fed vs. state, at most, changes the reference numbers of the applicable laws under which the action occurs.
You'd think that Civil vs. Criminal makes a difference. In one case you've got guilty/not guilty. In the other case, you've got liable/not liable/fractionally liable. And ALL of them can be dismissed, declared mis-trials, settled without verdict, etc. But the truth is, that result is still representable from one single table where you can look up a code to see what that result really means.
Step away from your design and look for commonalities. Then look for qualifiers that distinguish from the commonalities. Try this design in your head for a while:
tblBaseCase
long (autonumber, prime key) CaseNum - your firm's case number
integer (and foreign key) CaseType - used in a lookup table
long (and foreign key) Manager - one person in a firm is usually assigned as the responsible party regardless of who works it
date WhenAccepted - first time this case was placed on your books.
tblStaff
long (autonumber, prime key) StaffNum- code for every staff member
some text fields with person's name, address, phone, etc.
tblCaseWork
long (fk) CaseNum
long (fk) StaffNum
date WorkedOn
real Hours
Use tblCaseWork to record the time your staff spends. If a person works on a case, you record the hours here.
tblBillRates
long (fk) StaffNum
date RateStarts
date RateEnds
real BillPerHour
A junction between the casework table and the bill rate table (with attention to the date a billing rate applied) will let you generate your bills.
OK, now let's talk about your other tables. What do you need to know?
Well, how about interviews? You probably DON'T want to keep every frimpin' word they say in the db, but you could assign a file folder to interview and include a hyperlink to the file holding same. Interviews, being free-form, tend to be indescribable in fixed-format ways anyhow. You could have a list of interviews.
tlbInterview
long (pk, autonumber) - interview number
long (fk) CaseNum
text fields for person interviewed
code field for "this is good interview", "this is indifferent interview", "don't ever let this turkey on the stand", etc.
What about the claims/lecal charges associated with a case?
tblCaseDtls
long (fk) CaseNum
integer ChgClm - you enter this as Claim #1 or Charge #1
text LawRef - reference to the law. Like, in So. Cal, 187PC (Murder). This can be as complex a legal reference as you wish.
text PopularName - if the LawRef was CA 187PC, this would be "Murder"
integer PenaltyType - codes you can look up from an (implied here) penalty table, where some entries are civil penalties - judgements in cash, dation in paement (sorry if I spelled the Latin wrong). Others are criminal - county jail, state pen, federal slammer, free injections, etc.
OK, what about civil variants for the above? Torts usually claim injury under a particular law, too. So you'll need a law reference there too. And a popular name. Penalty types I've already addressed.
OK, results...
For each charge you will eventually need a verdict/result. This can be (from an implied tblResults-type table) Guilty, Liable in full, Non Guilty, Not Liable, etc. Where your locale allows guilty of lesser included charges, you have to include the lesser charges in the original charge table. Where your locale allows fractional liability, you have to allow for a number. Where you have sentence ranges, you might have two numbers. For civil fractional liability, you might need only one number - the percentage.
I'm blue-skying here, but the idea is that you need to look at these different aspects of a case not for their differences but for their similarities.
You would use a bunch of lookup tables to define possible results, possible penalties, etc.
OK, let's complicate matters... One case, multiple clients.
tblClients
long (pk, autonumber) ClientNum
name, address, phone, DOB, how much money we can soak him for ... forgive me, I digress...
tblCliCase
long (fk) CaseNum - for this case, ...
long (fk) ClientNum - this client was ...
integer (fk) ClmChg - charged with or sued for ....
notes
This is a junction table that can be extended to include verdicts if you wish.
In other words, it might just be an extension of the original results table. It says, we got Joe Schmo off but Bill Shill got thirty years, etc.
Let's look at motions filed
tblCaseMotions
long (fk AND part of PK) CaseNum
integer (part of PK with CaseNum) MotNum - which motion this is
text describing motion
code/text describing result of motion.
I'll suggest that you try to design this on paper while looking at similarities, not differences. Don't worry that sometimes you have blanks. That's a GOOD thing. What you DON'T want to have is no place to put something. THAT is when you've got tsuris. (Yiddish for "agony")
I don't see 400 tables as meaningful. I agree with WayneRyan. The more tables you've got, the worse off you are in trying to make sense of it all.
I see lots of lookup tables where the differences between civil and criminal or between state and federal simply imply different code numbers on the case in one of its attribute fields. Where different penalties are just different line items in a lookup table. Where each client has a single client number, where each case has a unique case number, where each staff member/partner has a unique ID code, etc.
I also see that where you see differences, you MIGHT want to step back a bit and either (a) realize it is a quibble or (b) realize that the item causing your heartburn is so unique that it might NEVER be fully described in any other way but with a big hompin' memo field anyway. But tables with special notes can be sparsely defined. I.e. not ever case will necessarily have one of those fields.