Thread: Inheritance or no inheritance, there is a question
I am working on an application system refinement. There is a user profile table in the current system. After the refinement,there are new separated roles, A and B, of the users. The role A only has a few valid fields of the original profiletable while the role B still has the whole profile table. In regarding of the DB scheme design, that should be anideal case of using inheritance. I can have something like table PROFILE_A ( ID int – PK, ... ): table PROFILE_B { ... inherits (A) ); However, there is a problem. There are some multi-valued field tables, such as languages the person can speak, associatedwith the profile table referred by ID in the profile table. These tables are still needed for the A and B. But,the ID is not accessible from the PROFILE_B. What is the best solution for this DB scheme problem? p.s. I can't use array data type for the multi-valued fields since they need to be workable with a selection statement, norxml or comma separated format for maintainablity concern. Thanks, v. ____________________________________________________________ Get advanced SPAM filtering on Webmail or POP Mail ... Get Lycos Mail! http://login.mail.lycos.com/r/referral?aid=27005
Vernon, > What is the best solution for this DB scheme problem? Have you considered not using inheritance? As a relational-SQL geek myself, I'm not keen on inheritance -- I feel it mucks up the relational model. Not everyone agrees with me, of course. Personally, I'd suggest the following structure: Profile Aid Primary Keydetail1detail2 Profile Bid Primary Key references Profile A ( ID )detail 3detail 4detail 5 Profile Languagesid not null references profile A ( ID )language idprimary key id, language id etc. In this way, Profile B is a child table with a 1:0-1 relationship with Profile A. Multi-value dependancies, like Languages, can be related to either the people who belong to the B group (and, by implication, the B group) or the people who belong to the A group only. Want the B group? SELECT A JOIN B Want the A group only? SELECT A EXCEPT B This is the "relational" way to approach the problem. -- Josh Berkus Aglio Database Solutions San Francisco
Vernon, > Thanks for your suggestion. I haven't thought this structure, to compose a > table with another one. That probably is the best solution I can have. With > this approach, I need to have two tables for B. As a result, all queries, > insertion, update, deletion, of B need to operate on these two tables. Is > it possible using a view to them as one table? Yes. In fact, by configuring PostgreSQL's RULE system, you can make the view updatable, insertable and deleteable as well. See the online docs under "CREATE RULE" and "Server-side Programming" -- Josh Berkus Aglio Database Solutions San Francisco
Josh Berkus <josh@agliodbs.com> wrote: > Vernon, > >> What is the best solution for this DB scheme problem? > > Have you considered not using inheritance? As a relational-SQL geek myself, > I'm not keen on inheritance -- I feel it mucks up the relational model. Not > everyone agrees with me, of course. > > Personally, I'd suggest the following structure: > > Profile A > id Primary Key > detail1 > detail2 > > Profile B > id Primary Key references Profile A ( ID ) > detail 3 > detail 4 > detail 5 > > Profile Languages > id not null references profile A ( ID ) > language id > primary key id, language id > > etc. > > In this way, Profile B is a child table with a 1:0-1 relationship > with Profile A. Multi-value dependancies, like Languages, can be > related to either the people who belong to the B group (and, by > implication, the B group) or the people who belong to the A group > only. > > Want the B group? SELECT A JOIN B > Want the A group only? SELECT A EXCEPT B > > This is the "relational" way to approach the problem. Grewvy! I've been running a system that takes various kinds of payments, some tables of which are below. INSERTs & UPDATEs only happen on the tables that inherit from the payment table. To sum up or otherwise do reports, I SELECT from the payment table. Is there some relational way to do this without ripping my hair out every time I want to do a new query? As some of you know, I don't have much hair left to lose ;) CREATE TABLE payment ( payment_id SERIAL NOT NULL PRIMARY KEY , order_id INTEGER NOT NULL REFERENCES order(order_id) ON DELETE RESTRICT , amount INTEGER NOT NULL -- pennies , payment_date DATE NOT NULL DEFAULT now() ); CREATE TABLE payment_check ( check_no INTEGER NOT NULL , payer_name VARCHAR(255) NOT NULL ) INHERITS (payment); CREATE TABLE payment_money_order ( issuer VARCHAR(255) NOT NULL , mo_num VARCHAR(64) NOT NULL ) INHERITS (payment); CREATE TABLE payment_wire ( payment_wire_desc VARCHAR(255) NOT NULL ) INHERITS (payment); Cheers, D -- David Fetter david@fetter.org http://fetter.org/ phone: +1 510 893 6100 cell: +1 415 235 3778 Fascism should more properly be called corporatism, since it is the merger of state and corporate power. Benito Mussolini