<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.openstack.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Betsy</id>
		<title>OpenStack - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.openstack.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Betsy"/>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/wiki/Special:Contributions/Betsy"/>
		<updated>2026-06-27T12:39:52Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Meetings/Designate&amp;diff=68353</id>
		<title>Meetings/Designate</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Meetings/Designate&amp;diff=68353"/>
				<updated>2014-11-19T00:25:41Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* Agenda */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= DNSaaS Meetings =&lt;br /&gt;
&lt;br /&gt;
The DNSaaS team holds a weekly IRC meeting in #openstack-meeting-alt on Wednesdays at 17:00 UTC&lt;br /&gt;
&lt;br /&gt;
Meeting logs are available at http://eavesdrop.openstack.org/meetings/designate/&lt;br /&gt;
&lt;br /&gt;
== Next meeting ==&lt;br /&gt;
&lt;br /&gt;
Date of next meeting [http://www.timeanddate.com/worldclock/fixedtime.html?ah=1&amp;amp;iso=20141112T17 Wednesday 12 November, 17:00 UTC]&lt;br /&gt;
&lt;br /&gt;
=== Agenda ===&lt;br /&gt;
&lt;br /&gt;
* Action Items from last week&lt;br /&gt;
* Specific Items:&lt;br /&gt;
** Pools - Where are we? (kiall)&lt;br /&gt;
** Mid-Cycle Dates/Locations/Topics (kiall)&lt;br /&gt;
*** I'd suggest we turn things around this time, and call it a hackathon&lt;br /&gt;
** Pools Question - Do we want to treat nameservers differently than poolattributes, or is it just a type of poolattribute? (betsy)&lt;br /&gt;
* Open Discussion&lt;br /&gt;
&lt;br /&gt;
=== Future/Unscheduled Agenda Items ===&lt;br /&gt;
&lt;br /&gt;
* None&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Meetings/Designate&amp;diff=57749</id>
		<title>Meetings/Designate</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Meetings/Designate&amp;diff=57749"/>
				<updated>2014-07-09T14:57:10Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* Agenda */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= DNSaaS Meetings =&lt;br /&gt;
&lt;br /&gt;
The DNSaaS team holds a weekly IRC meeting in #openstack-meeting-alt on Wednesdays at 17:00 UTC&lt;br /&gt;
&lt;br /&gt;
Meeting logs are available at http://eavesdrop.openstack.org/meetings/designate/&lt;br /&gt;
&lt;br /&gt;
== Next meeting ==&lt;br /&gt;
&lt;br /&gt;
Date of next meeting [http://www.timeanddate.com/worldclock/fixedtime.html?ah=1&amp;amp;iso=20140625T17 Wednesday 9 July, 17:00 UTC]&lt;br /&gt;
&lt;br /&gt;
We are back to our regularly scheduled IRC meetings after meeting on Google Hangouts for OpenStack Atlanta Summit preparation.&lt;br /&gt;
&lt;br /&gt;
=== Agenda ===&lt;br /&gt;
* Action Items from last week&lt;br /&gt;
* SOA records - making them visible and editable in v2 (betsy)[https://etherpad.openstack.org/p/soa-records etherpad]&lt;br /&gt;
* Open Discussion&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Meetings/Designate&amp;diff=57580</id>
		<title>Meetings/Designate</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Meetings/Designate&amp;diff=57580"/>
				<updated>2014-07-07T18:50:40Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* Next meeting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= DNSaaS Meetings =&lt;br /&gt;
&lt;br /&gt;
The DNSaaS team holds a weekly IRC meeting in #openstack-meeting-alt on Wednesdays at 17:00 UTC&lt;br /&gt;
&lt;br /&gt;
Meeting logs are available at http://eavesdrop.openstack.org/meetings/designate/&lt;br /&gt;
&lt;br /&gt;
== Next meeting ==&lt;br /&gt;
&lt;br /&gt;
Date of next meeting [http://www.timeanddate.com/worldclock/fixedtime.html?ah=1&amp;amp;iso=20140625T17 Wednesday 9 July, 17:00 UTC]&lt;br /&gt;
&lt;br /&gt;
We are back to our regularly scheduled IRC meetings after meeting on Google Hangouts for OpenStack Atlanta Summit preparation.&lt;br /&gt;
&lt;br /&gt;
=== Agenda ===&lt;br /&gt;
* Action Items from last week&lt;br /&gt;
* SOA records - making them visible and editable in v2 (betsy)&lt;br /&gt;
* Open Discussion&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56657</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56657"/>
				<updated>2014-06-24T20:19:48Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* TXT_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/recordsets-records-tables-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Could someone else verify that the Data Type, Length and Nullable fields are correct in the various records tables?&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56656</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56656"/>
				<updated>2014-06-24T20:19:08Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* SSHFP_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/recordsets-records-tables-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Could someone else verify that the Data Type, Length and Nullable fields are correct in the various records tables?&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56655</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56655"/>
				<updated>2014-06-24T20:18:56Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* SRV_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/recordsets-records-tables-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Could someone else verify that the Data Type, Length and Nullable fields are correct in the various records tables?&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56654</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56654"/>
				<updated>2014-06-24T20:18:45Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* SPF_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/recordsets-records-tables-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Could someone else verify that the Data Type, Length and Nullable fields are correct in the various records tables?&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56653</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56653"/>
				<updated>2014-06-24T20:18:33Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* SOA_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/recordsets-records-tables-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Could someone else verify that the Data Type, Length and Nullable fields are correct in the various records tables?&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56652</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56652"/>
				<updated>2014-06-24T20:18:22Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* PTR_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/recordsets-records-tables-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Could someone else verify that the Data Type, Length and Nullable fields are correct in the various records tables?&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56651</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56651"/>
				<updated>2014-06-24T20:18:12Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* NS_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/recordsets-records-tables-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Could someone else verify that the Data Type, Length and Nullable fields are correct in the various records tables?&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56650</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56650"/>
				<updated>2014-06-24T20:17:58Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* MX_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/recordsets-records-tables-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Could someone else verify that the Data Type, Length and Nullable fields are correct in the various records tables?&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56649</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56649"/>
				<updated>2014-06-24T20:17:43Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* CNAME_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/recordsets-records-tables-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Could someone else verify that the Data Type, Length and Nullable fields are correct in the various records tables?&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56648</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56648"/>
				<updated>2014-06-24T20:17:28Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* AAAA_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/recordsets-records-tables-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id|| CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Could someone else verify that the Data Type, Length and Nullable fields are correct in the various records tables?&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56647</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56647"/>
				<updated>2014-06-24T20:17:17Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* A_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/recordsets-records-tables-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Could someone else verify that the Data Type, Length and Nullable fields are correct in the various records tables?&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56646</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56646"/>
				<updated>2014-06-24T20:16:34Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* AAAA_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/recordsets-records-tables-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Could someone else verify that the Data Type, Length and Nullable fields are correct in the various records tables?&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56645</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=56645"/>
				<updated>2014-06-24T20:16:20Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* A_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/recordsets-records-tables-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
recordset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Could someone else verify that the Data Type, Length and Nullable fields are correct in the various records tables?&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Meetings/Designate&amp;diff=55755</id>
		<title>Meetings/Designate</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Meetings/Designate&amp;diff=55755"/>
				<updated>2014-06-12T17:24:46Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* Agenda */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= DNSaaS Meetings =&lt;br /&gt;
&lt;br /&gt;
The DNSaaS team holds a weekly IRC meeting in #openstack-meeting-alt on Wednesdays at 17:00 UTC&lt;br /&gt;
&lt;br /&gt;
Meeting logs are available at http://eavesdrop.openstack.org/meetings/designate/&lt;br /&gt;
&lt;br /&gt;
== Next meeting ==&lt;br /&gt;
&lt;br /&gt;
Date of next meeting [http://www.timeanddate.com/worldclock/fixedtime.html?ah=1&amp;amp;iso=20140618T17 Wednesday 18 June, 17:00 UTC]&lt;br /&gt;
&lt;br /&gt;
We are back to our regularly scheduled IRC meetings after meeting on Google Hangouts for OpenStack Atlanta Summit preparation.&lt;br /&gt;
&lt;br /&gt;
=== Agenda ===&lt;br /&gt;
&lt;br /&gt;
* Review action items from last week (See [http://eavesdrop.openstack.org/meetings/designate/ Meeting Logs] for previous week)&lt;br /&gt;
* Specific Items:&lt;br /&gt;
** Review  [https://blueprints.launchpad.net/designate/+spec/recordsets-records-tables-redesign blueprint] for Recordsets/Records db tables redesign (Betsy)&lt;br /&gt;
** Incubation progress (kiall)&lt;br /&gt;
* Open Discussion&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Meetings/Designate&amp;diff=55754</id>
		<title>Meetings/Designate</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Meetings/Designate&amp;diff=55754"/>
				<updated>2014-06-12T17:24:28Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* Agenda */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= DNSaaS Meetings =&lt;br /&gt;
&lt;br /&gt;
The DNSaaS team holds a weekly IRC meeting in #openstack-meeting-alt on Wednesdays at 17:00 UTC&lt;br /&gt;
&lt;br /&gt;
Meeting logs are available at http://eavesdrop.openstack.org/meetings/designate/&lt;br /&gt;
&lt;br /&gt;
== Next meeting ==&lt;br /&gt;
&lt;br /&gt;
Date of next meeting [http://www.timeanddate.com/worldclock/fixedtime.html?ah=1&amp;amp;iso=20140618T17 Wednesday 18 June, 17:00 UTC]&lt;br /&gt;
&lt;br /&gt;
We are back to our regularly scheduled IRC meetings after meeting on Google Hangouts for OpenStack Atlanta Summit preparation.&lt;br /&gt;
&lt;br /&gt;
=== Agenda ===&lt;br /&gt;
&lt;br /&gt;
* Review action items from last week (See [http://eavesdrop.openstack.org/meetings/designate/ Meeting Logs] for previous week)&lt;br /&gt;
* Specific Items:&lt;br /&gt;
** Review  [https://blueprints.launchpad.net/designate/+spec/recordsets-records-tables-redesign blueprint] for Recordsets/Records db tables redesign&lt;br /&gt;
** Incubation progress (kiall)&lt;br /&gt;
* Open Discussion&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55753</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55753"/>
				<updated>2014-06-12T17:20:01Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/recordsets-records-tables-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Could someone else verify that the Data Type, Length and Nullable fields are correct in the various records tables?&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55752</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55752"/>
				<updated>2014-06-12T17:18:35Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* Comments &amp;amp; Discussion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Could someone else verify that the Data Type, Length and Nullable fields are correct in the various records tables?&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55751</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55751"/>
				<updated>2014-06-12T17:17:46Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* Comments &amp;amp; Discussion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Please check that the&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55750</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55750"/>
				<updated>2014-06-12T17:16:15Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* TXT_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Comments &amp;amp; Discussion ==&lt;br /&gt;
# Numbered list item&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55749</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55749"/>
				<updated>2014-06-12T17:14:54Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the record_id, the recordset_id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset_id and the IPv4 address. The MX_Record table will contain the recordset_id and the FQDN for the mail server and its preference value. See the the tables below for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55747</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55747"/>
				<updated>2014-06-12T17:08:30Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* SSHFP_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || 255 || False || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55746</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55746"/>
				<updated>2014-06-12T17:08:06Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* SSHFP_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || TINYINT || 1|| False || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type ||TINYINT || 1 || False || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || False || 255 || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55745</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55745"/>
				<updated>2014-06-12T17:07:06Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* SRV_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== SSHFP_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| algorithm || INT || TINYINT|| False || || 0 reserved; 1 RSA; 2 DSS&lt;br /&gt;
|-&lt;br /&gt;
| type || INT || TINYINT || False || || 0 reserved; 1 SHA-1&lt;br /&gt;
|-&lt;br /&gt;
| fingerprint || VARCHAR || False || 255 || Fingerprint of the server public key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55743</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55743"/>
				<updated>2014-06-12T16:56:30Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* SOA_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SPF_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Authorized computers to send mail&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55742</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55742"/>
				<updated>2014-06-12T16:51:15Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* TXT_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || Text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55741</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55741"/>
				<updated>2014-06-12T16:50:59Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* PTR_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55740</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55740"/>
				<updated>2014-06-12T16:50:51Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* NS_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55739</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55739"/>
				<updated>2014-06-12T16:50:37Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* MX_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || Hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || Lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55738</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55738"/>
				<updated>2014-06-12T16:50:13Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* SOA_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55737</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55737"/>
				<updated>2014-06-12T16:49:54Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* SOA_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55736</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55736"/>
				<updated>2014-06-12T16:49:21Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* PTR_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SOA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| mname || VARCHAR || 255 || False || Primary name server&lt;br /&gt;
|-&lt;br /&gt;
| rname || VARCHAR || 255 || False || Domain name that indicates the email address&lt;br /&gt;
|-&lt;br /&gt;
| serial || INT || 11 || False || Serial number&lt;br /&gt;
|&lt;br /&gt;
| refresh || INT || 11 || False || Number of seconds between data refresh&lt;br /&gt;
|-&lt;br /&gt;
| retry || INT || 11 || False || Number of seconds between retries&lt;br /&gt;
|-&lt;br /&gt;
| expire || INT || 11 || False || Number of seconds before information is no longer considered authoritative&lt;br /&gt;
|-&lt;br /&gt;
| minimum || INT || 11 || False || Number of seconds that the records in the zone are valid &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55735</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55735"/>
				<updated>2014-06-12T16:26:46Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* A_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55734</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55734"/>
				<updated>2014-06-12T16:26:36Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* AAAA_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| address || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55733</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55733"/>
				<updated>2014-06-12T16:26:12Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* CNAME_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| cname || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55732</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55732"/>
				<updated>2014-06-12T16:25:37Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* NS_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PTR_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| ptrdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55731</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55731"/>
				<updated>2014-06-12T16:24:27Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* MX_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== NS_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| nsdname || VARCHAR || 255|| False || hostname&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55730</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55730"/>
				<updated>2014-06-12T16:18:43Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* TXT_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| text || VARCHAR || 255|| False || text &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55729</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55729"/>
				<updated>2014-06-12T16:17:28Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* SRV_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| target || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| weight || INT || 11 || False || Weight of the service&lt;br /&gt;
|-&lt;br /&gt;
| port || INT || 11 || False || Port of the service &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55728</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55728"/>
				<updated>2014-06-12T16:14:58Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* SRV_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| protocol || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55727</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55727"/>
				<updated>2014-06-12T16:14:04Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* CNAME_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| protocol || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55726</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55726"/>
				<updated>2014-06-12T16:13:45Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* MX_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
||id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| exchange || VARCHAR || 255|| False || hostname&lt;br /&gt;
|-&lt;br /&gt;
| preference || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| protocol || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55725</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55725"/>
				<updated>2014-06-12T16:10:00Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* AAAA_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| protocol || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55722</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55722"/>
				<updated>2014-06-12T16:08:40Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* RecordSets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| protocol || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55721</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=55721"/>
				<updated>2014-06-12T16:07:47Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* A_Records */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 36 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 36 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
|id || CHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
|recoredset_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| protocol || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=54859</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=54859"/>
				<updated>2014-06-04T14:28:10Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* A_RecordSets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 36 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 36 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| protocol || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=54374</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=54374"/>
				<updated>2014-05-30T19:49:31Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* A_RecordSets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== A_RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 36 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 36 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| protocol || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	<entry>
		<id>https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=54373</id>
		<title>Designate/Blueprints/Records Table Redesign</title>
		<link rel="alternate" type="text/html" href="https://wiki.openstack.org/w/index.php?title=Designate/Blueprints/Records_Table_Redesign&amp;diff=54373"/>
				<updated>2014-05-30T19:49:13Z</updated>
		
		<summary type="html">&lt;p&gt;Betsy: /* A_RecordSets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Gerrit Patch || []&lt;br /&gt;
|-&lt;br /&gt;
! Launchpad Blueprint || [https://blueprints.launchpad.net/designate/+spec/records-table-redesign]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Currently, there is only one RecordSets table and one Records table for all the different record types. This blueprint proposes to subdivide those tables into a RecordSet table and Record table per record type.&lt;br /&gt;
&lt;br /&gt;
Having one monolithic RecordSets table and Records table for all record types can become problematic as the size of the table grows. If any modifications need to be made, for example, adding a column, the entire table would have to be locked and it could take a long time to update a table with millions of records. In addition, if a table gets too large, it has to be sharded, which involves writing a lot of code to know which shard to call for which records. On the other hand, joins across tables are not a problem, as long as the indexing is done correctly. In addition, having a table per record type is a proven DNS database design as some companies have already implemented it in this fashion and have millions of records.&lt;br /&gt;
&lt;br /&gt;
Most of the information that is currently in the Records table will be consolidated into the RecordSet table. The Records table for each type will only contain the recordset id and the unique data for that particular record type. For instance, the A_Record table will contain the recordset id and the IPv4 address. The MX_Record table will contain the recordset id and the FQDN for the mail server and its preference value. See the full specification for more detail.&lt;br /&gt;
&lt;br /&gt;
== Database Schema Changes ==&lt;br /&gt;
&lt;br /&gt;
The existing Recordset table and Records table will become obsolete and be replaced with new tables for each record type.&lt;br /&gt;
=== Existing Tables ===&lt;br /&gt;
&lt;br /&gt;
==== Recordsets Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || UUID, Primary Key&lt;br /&gt;
|-&lt;br /&gt;
| created_at || datetime || - || True || Time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || datetime || - || True || Time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INT || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of recordset owner&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || Recordset name&lt;br /&gt;
|-&lt;br /&gt;
| type || ENUM || - || False || A, AAAA, CNAME, MX, SRV, TXT, SPF, NS, PTR, SSHFP&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INT || 11 || True || time to live&lt;br /&gt;
|- &lt;br /&gt;
| description || VARCHAR || 160 || True || Description of Recordset&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records Table ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || True || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| data || MEDIUMTEXT || - || False || Data unique to a specific record&lt;br /&gt;
|-&lt;br /&gt;
| priority || INTEGER || 11 || True || Priority value for certain types of records&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 32 || False || Non-unique Key, Domain ID&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Boolean value indicates a managed resource&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || Managed resource type&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || Managed resource id&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || Managed plugin name&lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || Managed plugin type&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key, Hash value of record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || Description of record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM(&amp;quot;Active&amp;quot;, &amp;quot;Pending&amp;quot;, &amp;quot;Deleted&amp;quot;) || - || False || Record status&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || VARCHAR || 36 || True || ID of record owner&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || CHAR || 32 || False || Non-unique Key, ID of recordset &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || CHAR || 32 || True || ID of managed owner&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || Region of managed&lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || Extra field&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== New Tables ===&lt;br /&gt;
&lt;br /&gt;
==== A_RecordSets ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| id || CHAR || 32 || False || Primary Key, Generated UUID&lt;br /&gt;
|-&lt;br /&gt;
| created_at || DATETIME || - || False || UTC time of creation&lt;br /&gt;
|-&lt;br /&gt;
| updated_at || DATETIME || - || True || UTC time of last update&lt;br /&gt;
|-&lt;br /&gt;
| version || INTEGER || 11 || False || Designate API version&lt;br /&gt;
|-&lt;br /&gt;
| tenant_id || CHAR || 36 || True || The tenant_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| domain_id || CHAR || 36 || False || Non-Unique Key; the domain_id to which the record belongs&lt;br /&gt;
|-&lt;br /&gt;
| name || VARCHAR || 255 || False || The zone to which the A record belongs&lt;br /&gt;
|-&lt;br /&gt;
| ttl || INTEGER || 11 || True || The time-to-live assigned to the record&lt;br /&gt;
|-&lt;br /&gt;
| description || VARCHAR || 160 || True || A description of the record&lt;br /&gt;
|-&lt;br /&gt;
| status || ENUM || 'Active', 'Pending', 'Deleted' || False || Current status of RecordSet&lt;br /&gt;
|-&lt;br /&gt;
| hash || VARCHAR || 32 || False || Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| managed || TINYINT || 1 || True || Indicates whether it is managed or not&lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_id || CHAR || 32 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_name || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_plugin_type || VARCHAR || 50 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_tenant_id || VARCHAR || 36 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_resource_region || VARCHAR || 100 || True || &lt;br /&gt;
|-&lt;br /&gt;
| managed_extra || VARCHAR || 100 || True || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== A_Records ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 15 || False || iPv4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== AAAA_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || BINARY || 16|| False || iPv6 address&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CNAME_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== MX_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT ||11 || False || lowest number has highest priority&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SRV_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || Name of the service&lt;br /&gt;
|-&lt;br /&gt;
| priority || INT || 11 || False || Priority of the service&lt;br /&gt;
|-&lt;br /&gt;
| protocol || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== TXT_Records ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Data Type !! Length !! Nullable !! Details&lt;br /&gt;
|-&lt;br /&gt;
| recordset_id || VARCHAR || 32 || False || UUID, Unique Key&lt;br /&gt;
|-&lt;br /&gt;
| record || VARCHAR || 255|| False || CNAME&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Betsy</name></author>	</entry>

	</feed>