I would put everything into custom-tables, also the universities with a xpdo-schema like that:
<?xml version="1.0" encoding="UTF-8"?>
<model package="universities" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM">
<object class="uvUniversity" table="universities_universities" extends="xPDOSimpleObject">
<field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default="" index="index" />
<field key="country" dbtype="varchar" precision="255" phptype="string" null="false" default="" index="index" />
<field key="city" dbtype="varchar" precision="255" phptype="string" null="false" default="" index="index" />
<field key="website" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="published" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
<field key="createdby" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<field key="createdon" dbtype="datetime" phptype="datetime" null="false" />
<field key="editedby" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<field key="editedon" dbtype="datetime" phptype="datetime" null="false" />
<field key="deleted" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
<field key="deletedon" dbtype="datetime" phptype="datetime" null="false" />
<field key="deletedby" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<field key="publishedon" dbtype="datetime" phptype="datetime" null="false" />
<field key="publishedby" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<composite alias="Courses" class="uvCourse" local="id" foreign="university_id" cardinality="many" owner="local" />
<composite alias="Videos" class="uvYoutubeVideo" local="id" foreign="university_id" cardinality="many" owner="local" />
<composite alias="Downloads" class="uvDownload" local="id" foreign="university_id" cardinality="many" owner="local" />
</object>
<object class="uvCourse" table="universities_courses" extends="xPDOSimpleObject">
<field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default="" index="index" />
<field key="duration" dbtype="varchar" precision="255" phptype="string" null="false" default="" index="index" />
<field key="mode" dbtype="varchar" precision="255" phptype="string" null="false" default="" index="index" />
<field key="university_id" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<field key="published" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
<field key="createdby" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<field key="createdon" dbtype="datetime" phptype="datetime" null="false" />
<field key="editedby" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<field key="editedon" dbtype="datetime" phptype="datetime" null="false" />
<field key="deleted" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
<field key="deletedon" dbtype="datetime" phptype="datetime" null="false" />
<field key="deletedby" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<field key="publishedon" dbtype="datetime" phptype="datetime" null="false" />
<field key="publishedby" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<aggregate alias="University" class="uvUniversity" local="university_id" foreign="id" cardinality="one" owner="foreign" />
</object>
<object class="uvDownload" table="universities_downloads" extends="xPDOSimpleObject">
<field key="application" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="application_description" dbtype="text" phptype="string" index="fulltext" />
<field key="file" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="university_id" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<field key="published" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
<field key="createdby" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<field key="createdon" dbtype="datetime" phptype="datetime" null="false" />
<field key="editedby" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<field key="editedon" dbtype="datetime" phptype="datetime" null="false" />
<field key="deleted" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
<field key="deletedon" dbtype="datetime" phptype="datetime" null="false" />
<field key="deletedby" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<field key="publishedon" dbtype="datetime" phptype="datetime" null="false" />
<field key="publishedby" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<aggregate alias="University" class="uvUniversity" local="university_id" foreign="id" cardinality="one" owner="foreign" />
</object>
<object class="uvYoutubeVideo" table="universities_youtubevideos" extends="xPDOSimpleObject">
<field key="url" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="description" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
<field key="university_id" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<field key="published" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
<field key="createdby" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<field key="createdon" dbtype="datetime" phptype="datetime" null="false" />
<field key="editedby" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<field key="editedon" dbtype="datetime" phptype="datetime" null="false" />
<field key="deleted" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
<field key="deletedon" dbtype="datetime" phptype="datetime" null="false" />
<field key="deletedby" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<field key="publishedon" dbtype="datetime" phptype="datetime" null="false" />
<field key="publishedby" dbtype="int" precision="10" phptype="integer" null="false" default="0" />
<aggregate alias="University" class="uvUniversity" local="university_id" foreign="id" cardinality="one" owner="foreign" />
</object>
</model>
than create a MIGX - configuration for each of this tables with the needed formtabs and columns
in the university - formtabs i would create a tab for each of courses,downloads,vidoes
and put one field into that tab with
field: a non existing fieldname
inputTVtype: migxdb
configs: the migx-configuration-name for this table
in the other configurations be sure to have checkResource to yes
and make the table autoloading (not by button)
and joinAlias to 'University'
create a migx-CMP (see the MIGXdb - doodles - tutorial) for the universities - table
this should basically be what you need.