in reply to 3Re: Class::DBI has_a relationships
in thread Class::DBI has_a relationships

OK. descriptions of tables are below.

Both Users and Sessions are referenced by Sessions_Metadata

Class::DBI doc says has_many is used to declare that another table is referencing us, so both Users and Sessions need a has_many(sessions_metadata)?

I tried this in sessions:

__PACKAGE__->has_many( sessions_metadata=>['EP::Common::DBI::Sessions_M +etadata' => 'session_id' ] => 'id' );
(and equiv in users) which I was hoping meant that 'session_id' is an FK in Sessions_Metadata which refers to 'id': the PK in sessions.
Still get the same error.
have I got the wrong end of the stick?
sessions_metadata Column | Type | Modifiers -------------+------------------------+----------- session_id | character(32) | not null username | character varying(40) | create_date | character varying(100) | expire | character varying(100) | query_id | character varying(50) | Indexes: sessions_metadata_pkey primary key btree (session_id) Foreign Key constraints: $1 FOREIGN KEY (session_id) REFERENCES sessio +ns(id) ON UPDATE NO ACTION ON DELETE NO ACTION, $2 FOREIGN KEY (username) REFERENCES users(us +ername) ON UPDATE NO ACTION ON DELETE NO ACTION sessions Column | Type | Modifiers -----------+---------------+----------- id | character(32) | not null a_session | text | Indexes: sessions_pkey primary key btree (id) users Column | Type | Modifiers --------------+------------------------+-------------------- username | character varying(40) | not null password | character varying(40) | not null salt | smallint | not null session_only | smallint | not null default 0 first_name | character varying(40) | not null last_name | character varying(40) | not null institute | character varying(255) | department | character varying(255) | address | character varying(255) | telephone | character varying(255) | email | character varying(100) | not null Indexes: users_pkey primary key btree (username)

Replies are listed 'Best First'.
5Re: Class::DBI has_a relationships
by jeffa (Bishop) on May 18, 2004 at 17:44 UTC

    Seems to me that your relationships are a bit off. At first i thought that Sessions_Metadata was a cross reference between Users and Sessions. But it is not. Instead, it is extra info for a session. Now, if this were my project, i would only have two tables: Users and Sessions. It seems to me that everything in Sessions_Meta data relates to a session, therefore, why not just put those attributes in the Sessions table?

    sessions
       Column    |          Type          | Modifiers 
    -------------+------------------------+-----------
     id          | character(32)          | not null
     a_session   | text                   | 
     username    | character varying(40)  | 
     create_date | character varying(100) | 
     expire      | character varying(100) | 
     query_id    | character varying(50)  | 
    
    It will greatly simply your task. Also ... why are you using a character type for the primary key? You should be using an "auto-incremented" integer, preferably unsigned. Likewise, you should also be using the same for your primary key in the Users table.

    UPDATE:
    I think that is correct, CassJ.

    jeffa

    L-LL-L--L-LL-L--L-LL-L--
    -R--R-RR-R--R-RR-R--R-RR
    B--B--B--B--B--B--B--B--
    H---H---H---H---H---H---
    (the triplet paradiddle with high-hat)
    
      It's not my DB. I don't know anything much about DB design, so I was just using what I was given. I don't see any reason why we sessions and sessions_metadata couldn't be merged though.
      I'll give it a go with my local version (might take a while!).

      If I do that then I'll have just a sessions table with a FK to users - right?

      So Sessions.pm

      has_a(username=>'Users')
      and Users
      has_many(sessions=>[Sessions=>'username']=>'username)
      Does that sound right?

      Cxx