Help :-) I can't see how this should be laid out!
Consider the scenario of a car rental company. They have "cars" and "lots"
(nationwide) and "customers. " So far it is easy to query each of these. A
car is rented by a customer so there would be say a "rentals" table. A car
is rented and returned over and over so there would be many rentals for each
car. One thing to remember is that the car isn't assigned to a specific lot
so either the customer has the car or it is in a lot (somewhere) and
available for rental.
So the question is how do I layout the tables (and query) to find out where
a specific car is? Or where all the cars are for that matter. I don't
think it is as simple as it looks at first glance. Clearly there can be a
column in the car table containing a LocationId but that wouldn't indicate
whether it is a LotId or a CustomerId. There could be a column for both
LotId and CustomerId and with only one filled in at a time but that doesn't
lend itself to an elegant SQL query does it?
I thought there might be a LocationIdType field. It could be set to
indicate whether the LocationId is a "lot" or a "customer" which permits me
to join with the lots or customers table but I wondered if there is another
way.
Is that enough information to go on? I can give more details if it helps.
Thanks,
Tom 25 3390
It's very difficult to give reliable design advice online without the
opportunity to analyse a particular business scenario in detail. With that
caveat in mind and based on the information given I would suggest a design
as follows. Customers and Lots are clearly different entities for most
purposes so keep them separate and use constraints to validate the data:
CREATE TABLE Vehicles (vin VARCHAR(10) PRIMARY KEY, lotid INTEGER NULL
REFERENCES Lots(lotid), customerid INTEGER NULL REFERENCES Customers
(customerid), CHECK ((lotid IS NOT NULL AND customerid IS NULL) OR (lotid IS
NULL AND customerid IS NOT NULL) /* Lot or Customer but not both */ ))
If you want to retrieve the location as a single column, you can use
COALESCE:
SELECT COALESCE(lotid, customerid) AS location
FROM Vehicles
You can also ensure that the same id is not used as both Lot and Customer:
CREATE TABLE VehicleLocation s (locationid INTEGER PRIMARY KEY, loctype
CHAR(1) CHECK (loctype IN ('L','C')), UNIQUE (locationid, loctype))
CREATE TABLE Customers (customerid INTEGER PRIMARY KEY, loctype CHAR(1) NOT
NULL CHECK (loctype = 'C'), FOREIGN KEY (customerid,loc type) REFERENCES
VehicleLocation s (locationid,loc type))
CREATE TABLE Lots (lotid INTEGER PRIMARY KEY, loctype CHAR(1) NOT NULL CHECK
(loctype = 'L'), FOREIGN KEY (lotid,loctype) REFERENCES VehicleLocation s
(locationid,loc type))
--
David Portas
------------
Please reply only to the newsgroup
--
"David Portas" <RE************ *************** *@acm.org> wrote... It's very difficult to give reliable design advice online without the opportunity to analyse a particular business scenario in detail.
No doubt, I had hoped I had conveyed the gist of it. So rather than discuss
"code" you're basically suggesting that the vehicle row would contain two
id's, one each for the two "types" of places it might be found? It is one
of the scenarios I considered. What I don't like about it (though I may be
stuck) is that it isn't impossible to predict a time when there would be a
third type of place the vehicle could be. It could be at a repair center
for instance. There would be a table of them (they are different than lots
and customers) and each would have an Id of course. At that point I have to
add a third Id field to the vehicles table.
I am in no way denigrating your suggestion or "throwing something in at the
last moment" I am only considering that all apps grow in time and personally
I like to have some room for growth. That said, I can't think of a better
way at the moment.
And it might work well. I can retrieve all the vehicles of course. The
ones that are at a lot would have a non-null LotId, the ones at a customer
have a non-null CustomerId. All vehicles at a particular lot or with a
particular customer can be isolated.
You can also ensure that the same id is not used as both Lot and Customer:
That part is handled, I have an ID "service" which assigns all the Ids.
Thanks,
Tom
Maybe:
CREATE TABLE Vehicles (vin VARCHAR(10) PRIMARY KEY, locationid INTEGER NOT
NULL REFERENCES VehicleLocation s (locationid))
Then you can easily add new location entities such as Repair Centres in the
same way as for Customers and Lots. Although if you don't need to capture
much information about the locations you could probably still manage with
two tables: one for Customers and one for other locations.
--
David Portas
------------
Please reply only to the newsgroup
--
"David Portas" <RE************ *************** *@acm.org> wrote... CREATE TABLE Vehicles (vin VARCHAR(10) PRIMARY KEY, locationid INTEGER NOT NULL REFERENCES VehicleLocation s (locationid))
Then you can easily add new location entities such as Repair Centres in
the same way as for Customers and Lots. Although if you don't need to capture much information about the locations you could probably still manage with two tables: one for Customers and one for other locations.
Hi David,
I'm not actually using MS-SqlServer (at least that can't be a guarantee) so
standard SQL queries have to produce the results. Doing it this way I can
see that I can find out if the vehicle is at a lot or out to a customer
through the code in VehicleLocation s table but I don't think a single query
will retrieve either the lot or customer information without my knowing
which table to look in, do I have that right?
Now that I look at it I'm not sure I can do that in a single query using the
multi-id column solution either. I can't choose the lot or customer table
until I know if the vehicle is rented. If I can, do you have a moment to
reply with the queries that would retrieve two things. One whether a
vehicle is rented or not (I think it can do that) and the other, the name of
the customer if it is rented (but you don't know if it is) where vin =
"12345"
Tom
You can do the query you want under either table design:
SELECT V.vin, V.locationid,
COALESCE(L.lot_ desc, C.cust_name),
CASE WHEN C.customerid IS NOT NULL
THEN 'RENTED' ELSE 'NOT RENTED' END
FROM Vehicles AS V
LEFT JOIN Lots AS L
ON V.locationid=L. lotid
LEFT JOIN Customers AS C
ON V.locationid = C.customerid
WHERE vin='12345'
SELECT V.vin, COALESCE(V.loti d,V.customerid) ,
COALESCE(L.lot_ desc, C.cust_name),
CASE WHEN C.customerid IS NOT NULL
THEN 'RENTED' ELSE 'NOT RENTED' END
FROM Vehicles AS V
LEFT JOIN Lots AS L
ON V.lotid=L.lotid
LEFT JOIN Customers AS C
ON V.customerid = C.customerid
WHERE vin='12345'
--
David Portas
------------
Please reply only to the newsgroup
--
"David Portas" <RE************ *************** *@acm.org> wrote... You can do the query you want under either table design:
Thanks David... I'm going to have a problem implementing that though (not
your problem of course) since the implementation of SQL I'm using doesn't
have COALESCE or CASE.
I might implement the structure and use two queries.
Thanks again,
Tom
On Wed, 17 Sep 2003 21:10:18 GMT, "Tom Leylan"
<ge*@iamtiredof spam.com> wrote:
[snippage interspersed] So the question is how do I layout the tables (and query) to find out where a specific car is?
In general, you can't know where a vehicle is when it's rented. Think
about a library and its books. Similar issues.
Clearly there can be a column in the car table containing a LocationId but that wouldn't indicate whether it is a LotId or a CustomerId.
A customer is not a lot.
I thought there might be a LocationIdType field. It could be set to indicate whether the LocationId is a "lot" or a "customer" which permits me to join with the lots or customers table but I wondered if there is another way.
I think you're struggling painfully toward an abstraction that
recognizes that there are many things you can do with a rental car.
You can rent it, lease it, sell it, send it to a garage for service,
loan it to your brother-in-law, have it stolen, misplace it, and so
on. Rentals require one set of attributes, sales require another set,
service requires yet another, and so on.
So you're looking at a table of vehicle dispositions (kind of like a
supertype), a supporting table for each dispostion (kind of like a
subtype), a view for each disposition (to make life easier by joining
the "kind of" supertype with its "kind of" subtype), and several
constraints to keep the data clean.
Did that make sense?
--
Mike Sherrill
Information Management Systems
"Mike Sherrill" <MS*******@comp userve.com> wrote... In general, you can't know where a vehicle is when it's rented. Think about a library and its books. Similar issues.
Hi Mike... I don't follow this, when did libraries stop tracking which books
you've borrowed? You can't think I mean "where" in terms of latitude and
longitude and in the case of a library book they don't care which shelve (if
any) you have it on. That you have it is it's "location" right? Clearly there can be a column in the car table containing a LocationId but that wouldn't
indicatewhether it is a LotId or a CustomerId.
A customer is not a lot.
That seems obvious. I'm still don't get your point.
You can rent it, lease it, sell it, send it to a garage for service, loan it to your brother-in-law, have it stolen, misplace it, and so on. Rentals require one set of attributes, sales require another set, service requires yet another, and so on.
Loaning it to a brother-in-law doesn't need to be tracked. Similarly
(should you ask) inching it forward on Main Street or backing out of the
driveway doesn't need to be tracked either... and I still don't get your
point. :-)
So you're looking at a table of vehicle dispositions (kind of like a supertype), a supporting table for each dispostion (kind of like a subtype), a view for each disposition (to make life easier by joining the "kind of" supertype with its "kind of" subtype), and several constraints to keep the data clean.
Did that make sense?
Nope. I can create tables designed to hold information about your
brother-in-law, the garage, the rental and the sale okay? Now how do I know
which table to check or is your solution to check them all noting which
record has the most current date/time of occurence? That's a lot of work to
find out if the car is in a lot available for rent.
I think I can do all this with with a single LocationId, LocationType pair
kept in the vehicle table. I'm working on that strategy at the moment.
"Tom Leylan" <ge*@iamtiredof spam.com> wrote in message
news:1a******** ********@twiste r.nyc.rr.com... "Mike Sherrill" <MS*******@comp userve.com> wrote...
So you're looking at a table of vehicle dispositions (kind of like a supertype), a supporting table for each dispostion (kind of like a subtype), a view for each disposition (to make life easier by joining the "kind of" supertype with its "kind of" subtype), and several constraints to keep the data clean.
Did that make sense?
Nope. I can create tables designed to hold information about your brother-in-law, the garage, the rental and the sale okay? Now how do I
know which table to check or is your solution to check them all noting which record has the most current date/time of occurence? That's a lot of work
to find out if the car is in a lot available for rent.
I think I can do all this with with a single LocationId, LocationType
pair kept in the vehicle table. I'm working on that strategy at the moment.
I think you are on the right track, with one minor suggestion. While
location,
(as indicated by a LocationID) is more or less an attribute of a vehicle,
location type is not. All you need in the Vehicle table is a LocationID.
Type can be determined by a join with the Location table. That makes
LocationType (an attribute of Location) in the Vehicle table redundant. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Randall Sell |
last post by:
Hello all,
I am migrating a Paradox application to SQL Server. My problem is that the
existing Paradox table structure is limited. Correcting it will mean a
re-write of the application (Delphi app). Although the record and column
limits are higher in SQL Server, it will eventually hit the wall. So I was
wondering if anyone could offer advise on how we might do this best....
The application is essentially an evaluation tool. It is very...
|
by: mksql |
last post by:
As an example, I am building an authentication mechanisim that will use
data in the 3 left tables to determine rights to objects in a
destination table, diagrammed below. In this structure, multiple
records in the left tables will point to multiple records in the right
table. Normally, I would approach this problem using junction tables
(LeftID, RightID) to create many-to-many joins.
However, given the structure of each table is nearly...
|
by: Laphan |
last post by:
Hi All
Wonder if you could help, I have a bog standard table called STOCKPRICES
that has served me well for a while, but now I need to change the structure
of it and because a number of users have used it in it's present form I need
to so the following in SQL script:
a) Grab a snapshot of the current SQL data.
b) Re-structure the STOCKPRICES table.
|
by: brett valjalo |
last post by:
Hey Gang!
SORRY ABOUT THE LENGTH!
Nice to see some of the same faces around this place from way back
when ... Whatta buncha CDMA addicts some o' y'all are ;)
Don't get me wrong, I understand, believe me! Took me a lot of
therapy, various 12-step programmes, interventions by loved ones, etc,
but I finally managed to excavate, er, extricate myself from the
|
by: dough |
last post by:
I have a hash table with seperate chaining with a bunch of words in it.
Here is my declaration:
typedef struct word *word;
struct word
{
int count;
char *s;
word next;
};
| |
by: Pavan |
last post by:
Hi All,
I am having a wierd problem while displaying my panel. My code is
something like this
<table>
<tr>
<td width=100>label</td>
<td width=100>label</td>
<td width=100>label</td>
<td width=100>button in this cell</td>
|
by: The Frog |
last post by:
Hello Everyone,
I have been asked to try and create a single SQL query to retrieve
product information from a database. The way that data is arranged is
that in some tables there are user defined "attributes" or
"dimensions" that in turn connect to the actual product table via a
many-many (using a linking table). In each linking table there is a
combination of the "dimension", the productID, and the "fact" that is
stored against the...
|
by: Michael.Z |
last post by:
Anyone who can help:
Given a Table.h file I am writing a Table.c file.
I keep getting the compile error:
previous declaration of Table was here / conflicting types for
I think the problem was the result of two pieces of code.
First: typedef struct Table; /* in Table.c*/
|
by: billelev |
last post by:
I'm building a database and am a bit stumped about how to construct/link tables. I will describe the current configuration, then present the problem I am trying to solve.
Currently:
I currently have a table called tblSeries. This table holds information about a time series of data, and how that data should be displayed. It has a SeriesDataID field that will link to another table (tblSeriesData) that contains information about the name...
|
by: provor |
last post by:
Hello,
I have the following code that I am using when a user presses a button to import an excel file into a table. The code is hard coded to point to the correct table. This works great for this one table. My problem is I have two buttons I want to use this code for for the two buttons would put the data in different tables. I have tried copying and changing a few things and nothing will work for me. The code is set up in a module and then I...
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look !
Part I. Meaning of...
| |
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it.
Here is my compilation command:
g++-12 -std=c++20 -Wnarrowing bit_field.cpp
Here is the code in...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules.
He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms.
Adolph will...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one.
At the time of converting from word file to html my equations which are in the word document file was convert into image.
Globals.ThisAddIn.Application.ActiveDocument.Select();...
| |
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
| |