- PeterMoulding.com
- Author
- Trainer
- Speaker
- Business Coach
- How to write a How To book
- PHP Courses
- Speaking
- Web Architect
- Australia
- Books
- Authors
- Akkana Peck
- Alex Berenson
- Andrew Nugent
- Ben Sanders
- Brock Clarke
- Chris Simms
- David Mercer
- Dianna Mullet
- Don Winslow
- Dori Smith
- Harlan Coben
- Jack McDevitt
- James Wines
- Jerry Yudelson
- John Grisham
- Kevin Mullet
- L. E. Modesitt Jr.
- Laurell K. Hamilton
- Marshall Karp
- Martina Cole
- Michael Marshall Smith
- Michel Roux Jr
- Nadia Sawalha
- Philip Pullman
- Raymond Khoury
- Richard North Patterson
- Robert Masello
- Sally Roth
- Sarah Langan
- Stella Rimington
- Stephen Booth
- Stephen King
- Stephen Leather
- T.C. Boyle
- Tom Negrino
- Tony Hillerman
- Urban Waite
- Val McDermid
- Valerio Massimo Manfredi
- Beginning GIMP
- Beginning Visual C++
- Culturalism
- Fiction
- A Drink Before The War
- A Talent for War
- Bag of Bones
- Blood and Ice
- Burn
- Dark Lady
- Dead Line
- Eclipse
- Empress of Eternity
- Exley
- Flipping Out
- Just One Look
- Nightfall
- Pet Sematary
- Savage Moon
- Skinwalkers
- Starvation Lake
- The Fallen
- The Gardens of the Dead
- The Jump
- The Last Templar
- The Mermaids Singing
- The Midnight Mayor
- The Secret Soldier
- The Summons
- The Terror of Living
- The Testament
- The Tower
- Under the Dome
- Virus
- AJAX and PHP
- Aging with Grace
- Food books
- Green Architecture
- Life Is So Good
- SQL: The Complete Reference
- The Backyard Bird Lover's Ultimate How-to Guide
- The Garden Gurus
- Authors
- Sustainability
- -18 hours left to decide the future of Australia
- Campbells vegetable stock or Massel vegetable stock?
- Carbon Sequestration
- Carbon tax for Australia is a fraud
- Copenhagen will fail
- Cost of living in Australia
- Dick Smith jumps on the population bandwagon
- Dry Run: Preventing the Next Urban Water Crisis
- Energy Saving Lights
- Garlic
- How many people can live in Australia?
- Its obsolete, throw it out!
- Julia Gillard offers 9.9 billion dollars bribe to Rob Oakeshott
- Laundry detergent
- Petrol or Diesel?
- Reflective foil batts kill
- RoHS
- Sea level to rise 3mm due to climate change
- Solar power
- Spring again in Sydney
- Sustainable fuels
- The CRUD Tax is back
- The people who make building regulations do not own houses
- Water efficiency
- Which insulation is safer, foil or wool?
- Will Australia reduce greenhouse gas emissions?
- Technology
- Android or Blackberry or iPhone or a flip phone?
- Apple versus Google 2011
- Cameras
- Cars
- Colour
- Burgundy
- Colour Blindness
- Colour Names
- Dulux colours
- Pantone colours
- Safe Colours
- Seculine ProDisk Mini colour balance card
- What Causes Colour Blindness?
- Hardware
- Batteries for the Digital Age
- Cables
- Cases
- Computer reliability
- Computrace
- Disks
- Astone ISO Gear 481E
- Best SSD for your notebook computer
- Disk block size
- Hitachi disk HDS722020ALA330
- LaCie USB 2.0 250 GB mobile hard drive design by F.A. Porsche
- SMART disk
- Samsung 2 TB HD204UI quiet low power disk for mass storage
- Seagate and Samsung merge disk business
- Select the right disk for your RAID array
- USB disk speed
- Western Digital WD20EARX 2 GB SATA 3 disk
- How long should computer hardware last?
- Keyboards
- Mainframe
- Memory cards
- Monitors
- Netbooks, notebooks, tablets, and xPads
- Network Attached Storage
- OLED Displays
- PC's are a thing of the past
- Printers
- Quiet
- Samsung Galaxy S
- Speed
- Television
- Tools
- USB
- Worst computer movies
- Xserve is dead. What next?
- Your backup will not work
- Z68 motherboards
- iPad or Acer Aspire One?
- IQ
- LG Intello Washing Machine
- Lack of a challenge
- Networks
- 802.11n wireless networking
- D-Link DIR-655 wireless router
- D-Link DWA-160 Xtreme N dual band USB adapter
- D-Link DWA-556 Xtreme N PCI Express desktop adapter
- MIMO
- NBN spends another $12 billion of our tax money on nothing
- National Broadband Network
- Netgear wireless modem router DGND3300 with 300 Mbps 802.11n
- Refrigerator kills wireless broadband
- Small Wireless Network
- TP-LINK TL-SG10005D 5 port gigabit switch
- TP-Link TL-WR1043N wireless N gigabit router
- Telstra Pre-paid Mobile Wi-Fi
- Where are the router plus proxy server combinations?
- Open Source documentation
- Software
- 7-zip
- Accounting
- Asterisk
- Audacity
- Backup software
- Bloat only in Windows
- CAD
- CDex
- Disk imaging software for copying and backup
- Exact Audio Copy
- Filezilla
- Firefox
- Java
- LibreOffice or OpenOffice?
- Linux
- 1 in 5 servers will ship with Linux
- Android phones outsell iPhone
- Another Move to Linux
- CentOS 5.5 installation on SSD and RAID 5
- Debian
- Debian 5.0.5 AMD64 installation
- Debian 5.06 installation
- Fedora
- Fedora or Ubuntu?
- Gnome or KDE?
- K9copy
- Linux 2.6.38
- Linux Gnome login settings lost
- Linux Mint
- Linux RAID, a rant
- Linux Speed
- Linux Time
- Linux reliability as demonstrated by Ubuntu 10.10
- Linux reliability as demonstrated by Ubuntu 11.4
- Linux still a struggle in 2011
- Linux workstation disk RAID 1
- Linux, NT, Windows, and SETI
- Linux, three years of progress
- London Stock Exchange switches to Linux
- Mandrake Linux 9.2
- The partition is misaligned by 48128 bytes - warning from Linux RAID
- Ubuntu
- How to fix the scroll bars in Ubuntu 11.4 Gnome
- Kubuntu 10.10 alternate installation on desktop with RAID 1
- POWbuntu
- Ubuntu 10.10 after 6 months use
- Ubuntu 10.10 alternate installation
- Ubuntu 10.10 desktop RAID 1
- Ubuntu 10.10 desktop RAID 5
- Ubuntu 10.10 desktop install on a netbook
- Ubuntu 10.10 desktop installation
- Ubuntu 10.10 netbook install on a netbook
- Ubuntu 10.10 server AMD64
- Ubuntu 10.10 upgrade to version 11.4 beta 2
- Ubuntu 10.4
- Ubuntu 11.10
- Ubuntu 11.10 first upgrade
- Ubuntu 11.4 after one month use
- Ubuntu 12.04 beta1 desktop amd64
- Ubuntu One
- Ubuntu by Microsoft?
- Ubuntu desktop upgrade 10.4 to 10.10 failed because I did not check the media
- Ubuntu strikes again
- Upgrade Ubuntu to Linux Mint 12 LDXE for extra speed
- Yes, use Linux but not that distribution!
- Nero
- OpenOffice
- OpenOffice is now Apache Office
- Project management
- Scribus
- Software for Windows and Linux
- Text editors
- Time
- Todo applications
- Tomboy notes
- Top text editors
- Version control
- VideoLAN VLC media player
- Visio
- Webmin
- Webmin installation on CentOS for Web development
- Webmin installation on Ubuntu
- What is the most popular open source software today?
- Windows
- Another Windows person goes Linux
- BAD_POOL_CALLER
- Cygwin
- Microsoft Malicious Software Removal Tool cannot find a common virus
- One of the developers of Windows XP is criminally insane
- There are unused icons on your desktop
- W32time
- Which Windows version?
- Windows 7 Home Premium
- Windows XP Stop 0x0000007B during installation
- Windows XP is a disaster
- Windows processes
- XML
- Zip, bzip, gzip, or 7zip?
- configFree
- Technology Succession Planning
- VoIP
- Web Sites
- Drupal
- Do Drupal themes have to use the GPL?
- Drupal 7
- A better search facility for Drupal
- Drupal - performance or flexibility
- Drupal 7 Fields are hard to fix
- Drupal 7 new features
- Drupal 7 ships on January 5
- Drupal 7.14
- Drupal 7.4 hits PeterMoulding.com
- Drupal function sequence
- The evolution of a module
- Undefined index: headers in DefaultMailSystem->mail() (line 54 of /modules/system/system.mail.inc).
- Undefined index: to in DefaultMailSystem->mail() (line 83 of /modules/system/system.mail.inc).
- implode(): Invalid arguments passed in DefaultMailSystem->format() (line 23 of /modules/system/system.mail.inc).
- Drupal 8
- Drupal Code Load Cut
- Drupal How To
- Drupal Modules
- Backup and Migrate
- Browscap
- CKEditor with Drupal WYSIWYG
- Captcha
- Cel
- Colorbox
- Content Construction Kit
- Content type
- Devel module for Drupal
- Drupal Rules as an automation language
- Drupal Spam add-on module
- Form alter to node
- IMCE
- IMCE Wysiwyg bridge
- ImageAPI
- Jdog
- Lightbox2
- Module variable
- Node Gallery Access
- Node_Gallery
- Path
- Path redirect
- Pathauto
- Pet
- Search
- Service links
- Session Variable
- Statistics
- Taxonomy
- Token
- Token ex
- Transliteration
- Trigger
- Watch
- Other modules
- Drupal Training
- Drupal access controls need a major rewrite
- Drupal coding tricks
- Drupal performance
- Drupal themes for the future
- Drupal.org colours
- Import existing data into Drupal
- Multiple Web sites made easy using Drupal multisite and the right start
- drupal_lookup_path()
- Adobe PDF
- Apache
- Apache Mahout
- Audi.com
- Bleet
- CSS Strikes Again
- CSS or xCSS
- Can you believe Facebook or email?
- Content Management Systems
- Databases
- Facebook scam
- Font
- Fonts
- HTML
- Install Apache, MySQL, and PHP 5 in Ubuntu 11.4 using the Ubuntu Software Centre
- Language Codes
- Marketing
- Memcache
- Nginx
- Open source development hits another roadblock
- Oscars
- PHP
- SPDY
- Search software
- Techoni.com.au
- Theme themes
- Things to hate on Web sites
- U.S. Patent No. 6,985,875
- Virtual Private Server
- Visible Improvement
- Web 4.0
- Web browser usage
- Web browsers
- Web site development
- Bluefish
- Crying over spilt code
- Eclipse and PHP
- Getting a Git client, a story of ancient technology and pain
- HTTrack
- MVC
- Netbeans
- PHP or ..., CakePHP/Symfony/ZF versus ...
- Programming
- Superfish
- Web browser emulators for testing your Web site
- Web development frameworks
- Web site books
- Web site development on your own computer
- Webmin or phpMyAdmin or cPanel for creating databases?
- aiki framework
- jQuery
- Views development - Learn Fields first
- Views development - Learn Actions and Rules
- jQuery .each()
- jQuery .has()
- jQuery .is()
- jQuery and Firefox Firebug
- jQuery children
- jQuery for people not using Drupal - Installation and getting started
- jQuery hover
- jQuery hover de-duplication example
- jQuery or CSS?
- jQuery performance
- jQuery tests
- Web site hosting
- Westpac Web site still broken after two years and ten months
- Wordpress wins another CMS survey
- Drupal
Database Relationships
Submitted by Peter on Fri, 2010-06-04 16:43
I have to make a database from where a user can select fields from a table or tables. My biggest problem is asking about relationships between tables (foreign keys) and passing the names of the requested tables to a processing page.
City: Püspökladány
Country: Hungary
You can use MySQL with InnoDB or PostgreSQL.
The database limits your choice of relationship handling. To answer your question in detail, I need to know which database or databases you want to use and how you will access those databases.
The most popular database for use on Web sites is MySQL and for a long time MySQL did not have table relationships built in. Now MySQL includes the InnoDB database engine that has relationships. PostgreSQL, Oracle, and some other databases have always had relationships built in.
MySQL
MySQL has several database engines for different uses. If you use the popular default MySQL MyISAM engine, you have to build relationships in to your code. That means you could let your visitor select fields for relationships then built PHP code or complex SQL to handle the relationship. You could also design your own relationships, define the relationships in a PHP array, then write code to process the relationships based on the tables. Once the relationships are listed in an array, you can use the array to list the relationships on your field selection form.
Relationships in code is not safe because anyone can use different code and not enforce the relationships. Enter InnoDB. InnoDB has relationships built in, making your database safe not matter what type of code updates the database. InnoDB has one disadvantage. All the tables are in one file, limiting the size of the database. MyISAM and PostgreSQL do not have that limitation.
PostgreSQL
PostgreSQL and similar databases give you the choice of using database-controlled relationships or relationships built in to code in the form of stored procedures or in views.
Stored procedures are normally used to validate data for a field and may be used to build complex data types from a set of simple fields. There is nothing to stop you using stored procedures to assemble data from several tables and effectively implement relationships between the tables. You are more likely to use proper relationship and use the stored procedures only for the data assembly.
Views are a way of creating virtual tables from real tables. Views could create relationships between tables when you read the data and, the same as stored procedures, you would normally use real relationships to protect the data.
Validating in code
The built in relationships could be defined in a PHP array or you could write code to read the relationships from the database using SQL commands. you can then validate the relationships between data before writing to the database.
Which database will be used for your project?
For PostgreSQL, you could look at the code in phpPgAdmin to see how they read information from PostgreSQL. There are PHP based administration interfaces for other databases and one of them might give you an example of the code you need. phpMyAdmin is the best PHP based administration interface for MySQL.
ODBC provides a standard interface to databases. IBM made ODBC the standard interface for their DB2. ODBC provides a standard way of performing simple queries but does not define how a database should implement administration functions in SQL. You still have to write SQL to fit individual databases. Some databases do not provide all administration functions through SQL so you may not be able to list relationships through ODBC.
After you decide how to find the structure of your database, you would have array $t to list the tables:$t[] = 'city';
$t[] = 'suburb';
$t[] = 'street';
Next you build array $f to list fields:$f['city'][] = 'name';
$f['city'][] = 'population';
$f['suburb'][] = 'city';
$f['suburb'][] = 'name';
$f['suburb'][] = 'population';
$f['street'][] = 'city';
$f['street'][] = 'suburb';
$f['street'][] = 'name';
$f['street'][] = 'population';
Next you build array $r to list relationships. This is the hardest as the detail in the table decides how much control you can put in to your forms and SQL. The following example says table 'suburb' has a relationship to table 'city' and within that relationship field 'city' matches field 'name'.$r['suburb']['city']['city'] = 'name';
This would generate SQL containing:where suburb.city = city.name
The following example says table 'street' has a relationship to table 'suburb' and within that relationship field 'city' matches field 'city' and field 'suburb' matches field 'name'.$r['street']['suburb']['city'] = 'city';
$r['street']['suburb']['suburb'] = 'name';
This would generate SQL containing:where street.city = suburb.city and street.suburb = suburb.name
PHP tables can be sorted and can be used to build other tables in different structures. That means you can take the example tables and build lists containing information to suit your application. If you want to store more information about relationships, you can add extra fields to the tables. Probably the first items I would add are short descriptions of each field and relationship so the descriptions can be displayed next to the fields on your forms.
Forms are described in a chapter of the PHP Black Book. Common SQL and database usages are described in other chapters. Accessing information about relationships was not included in the book because the code is very database dependent and you have to know a lot of information about the way the database controls a relationship before you can write code to dynamically build SQL to work with relationships.
Imagine trying to delete suburbs in the example city, suburb, street tables. If you want to delete suburb X and there are streets listed in suburb X, the database might be set up to not let you delete suburb X until you delete all streets in suburb X. Your SQL has to first delete all streets in suburb X then delete suburb X.
The database relationship might be set up to let you delete suburb X and automatically delete all the streets in suburb X. That makes life easier if you want to delete all the streets. What if you want to leave suburbs in the database when they contain streets? You have to write SQL to count the streets in suburb X before deciding if you will delete suburb X.
Your database might let you write SQL, which performs everything in one step. Your database might not support complex SQL and may make you write stored procedures to perform the actions. I suggest avoiding stored procedures because they limit your options for your user interface. A mixture of SQL and PHP could perform the same work without limiting your options.
The next step depends on your database. You have to decide how much flexibility you want in your user interface and work out the simplest way to provide that flexibility with your database. Read the PHP Black Book for general form and database code, then look through open source PHP based projects for database specific code examples. A good book on the SQL used in your database will help build the optimum SQL.








