Results 1 to 2 of 2

Thread: Polymorphic DB Tables

  1. #1
    Join Date
    Dec 2006

    Polymorphic DB Tables

    (Summary: I want to have an is-a relationship in PHP also be in the database, and if I search for something in the table of the base class, it will also search in the table of the child class. I also need this treatment with updating, inserting, and deleting. Does anyone know of a framework that will do this?)

    So, I've been dealing with some pretty crazy ideas. But I'm absolutely positive that others have thought of this and perhaps even implemented it, though google and forum searches reveal nothing.

    In PHP, I have a base class:
    - Person, with property "name".
    Two subclasses of Person:
    - Programmer, with property "IQ" and inherited property "name".
    - Quarterback, with property "Apishness" and inherited property "name".

    The question is how to represent this class "Tree" in the database.

    === Implementation 1 ===

    In the database, there is one table:
    - Person, column "type", column "name", optional column "IQ", and optional column "Apishness"

    The idea is that the database be able to:
    - Pay attention to the "IQ" column only if "type" = "Programmer" (likewise for Apishness/Quarterback).
    - Only look through the Programmer subset when I only want a Programmer (likewise for Quarterback).
    - Instantiate a Programmer object if the row is a Programmer (likewise for Quarterback).

    === Implementation 2 ===

    In the database, there are three tables:
    - Person, column "name".
    - Programmer, columns "name" and "IQ"
    - Quarterback, columns "name" and "Apishness"

    The idea is that the database be able to:
    - Look through all three tables when I want a Person.
    - Look through only the Programmer table when I want Programmers (likewise for Quarterback).
    - Instantiate a Programmer object when I recall from the Programmer table (likewise for Quarterback).


    Either way, the usage will be the same. So far, something like this:

    class Notification extends DBData {
    	const childTables = "NewGameNotification, ChatNotification";
    	const columnsDDL = "time int, playerID int";
    	public $time, $playerID;
    class ChatNotification extends Notification {
    	const childTables = "ColoredChatNotification, EmotedChatNotification";
    	const columnsDDL = 'fromPlayerID int, text text';
    	public $fromPlayerID, $text;
    I hope by now, the idea is clear: I want to be able to have a Person, Quarterback, or Programmer object, be able to put it in the database, bring it back just as it was. I also want the luxury to be able to treat them all as Person, because they are all of type Person, after all.

    So, my official question is, is there a framework that will do this for me? I've already finished implementation 1, and am almost done with implementation 2, over 1000 lines already.

    The reason I need to know this is because either implementation has its drawbacks, implementation 1 has a lot of wasted space, but uses less queries, and is faster for small amounts of data. Implementation 2 is better for large amounts of data, but uses more queries, and can't do things like LIMIT, or ORDER without falling back on implementation 1 temporarily.
    Last edited by Verdagon; 08-29-2009 at 08:28 AM.

  2. #2
    Join Date
    Aug 2004
    I would define a "class" table that only has information about the class (not its properties). This table would be implemented to represent the hierarchical relationship between parent/child classes using either the "adjacency list" or "nested set" model. See http://dev.mysql.com/tech-resources/...ical-data.html for more info. (I'd go with the nested set approach, myself, as being more flexible/powerful.)

    Then I'd have a separate table for properties, which would include a foreign key relationship to its class's primary key. Assuming your DBMS version/storage-engine supports it, you could use foreign key triggers to handle things like deleting all of a class's properties when a class is deleted.
    "Well done....Consciousness to sarcasm in five seconds!" ~ Terry Pratchett, Night Watch

    How to Ask Questions the Smart Way (not affiliated with this site, but well worth reading)

    My Blog
    cwrBlog: simple, no-database PHP blogging framework

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
HTML5 Development Center



X vBulletin 4.2.2 Debug Information

  • Page Generation 0.09561 seconds
  • Memory Usage 2,848KB
  • Queries Executed 13 (?)
More Information
Template Usage (33):
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_global_above_footer
  • (1)ad_global_below_navbar
  • (1)ad_global_header1
  • (1)ad_global_header2
  • (1)ad_navbar_below
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (1)ad_thread_first_post_content
  • (1)ad_thread_last_post_content
  • (1)bbcode_code
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)headinclude_bottom
  • (2)memberaction_dropdown
  • (1)navbar
  • (4)navbar_link
  • (1)navbar_moderation
  • (1)navbar_noticebit
  • (1)navbar_tabs
  • (2)option
  • (2)postbit
  • (2)postbit_onlinestatus
  • (2)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available (6):
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files (26):
  • ./showthread.php
  • ./global.php
  • ./includes/class_bootstrap.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/functions_navigation.php
  • ./includes/class_friendly_url.php
  • ./includes/class_hook.php
  • ./includes/class_bootstrap_framework.php
  • ./vb/vb.php
  • ./vb/phrase.php
  • ./includes/functions_facebook.php
  • ./includes/functions_calendar.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_notice.php
  • ./packages/vbattach/attach.php
  • ./vb/types.php
  • ./vb/cache.php
  • ./vb/cache/db.php
  • ./vb/cache/observer/db.php
  • ./vb/cache/observer.php 

Hooks Called (71):
  • init_startup
  • friendlyurl_resolve_class
  • init_startup_session_setup_start
  • database_pre_fetch_array
  • database_post_fetch_array
  • init_startup_session_setup_complete
  • global_bootstrap_init_start
  • global_bootstrap_init_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • load_show_variables
  • load_forum_show_variables
  • global_state_check
  • global_bootstrap_complete
  • global_start
  • style_fetch
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • strip_bbcode
  • friendlyurl_clean_fragment
  • friendlyurl_geturl
  • forumjump
  • cache_templates
  • cache_templates_process
  • template_register_var
  • template_render_output
  • fetch_template_start
  • fetch_template_complete
  • parse_templates
  • fetch_musername
  • notices_check_start
  • notices_noticebit
  • process_templates_complete
  • friendlyurl_redirect_canonical
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • memberaction_dropdown
  • tag_fetchbit
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • build_navigation_data
  • build_navigation_array
  • check_navigation_permission
  • process_navigation_links_start
  • process_navigation_links_complete
  • set_navigation_menu_element
  • build_navigation_menudata
  • build_navigation_listdata
  • build_navigation_list
  • set_navigation_tab_main
  • set_navigation_tab_fallback
  • navigation_tab_complete
  • fb_like_button
  • showthread_complete
  • page_templates