PostgreSQLSchemaForStore

Summary

Foswiki is great, but it would be nice if data could be stored in an SQL database. I have heard of other people trying to do this, so in order not to duplicate too much effort, I am uploading my schema.

Data

All the tables. Sorry that I did not make it look neat.

CREATE TABLE foswiki."Attachment_History"
(
  "key" uuid NOT NULL,
  topic_key uuid NOT NULL,
  "version" integer DEFAULT nextval('foswiki.attachment_history_revision'::regclass),
  path text,
  size integer NOT NULL,
  timestamp_epoch integer NOT NULL,
  user_key uuid NOT NULL,
  attr text,
  file_name text NOT NULL,
  file_type text NOT NULL,
  blob_store_key bytea,
  file_store_key text NOT NULL,
  attachment_key uuid NOT NULL,
  "comment" bytea,
  CONSTRAINT attachment_history_key PRIMARY KEY (key),
  CONSTRAINT attachment_relation FOREIGN KEY (attachment_key)
      REFERENCES foswiki."Attachments" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT topic_key_relation FOREIGN KEY (topic_key)
      REFERENCES foswiki."Topics" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT user_relation FOREIGN KEY (user_key)
      REFERENCES foswiki."Users" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE
)
WITH (
  OIDS=FALSE
);
CREATE TABLE foswiki."Attachments"
(
  "key" uuid NOT NULL,
  link_to_latest uuid DEFAULT '00000000-0000-0000-0000-000000000000'::uuid,
  current_attachment_name text DEFAULT 'Some Unknown File Name'::text,
  current_topic_key uuid DEFAULT '00000000-0000-0000-0000-000000000000'::uuid,
  CONSTRAINT attachments_key PRIMARY KEY (key),
  CONSTRAINT link_to_latest_relation FOREIGN KEY (link_to_latest)
      REFERENCES foswiki."Attachment_History" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT attachment_name_uniqueness UNIQUE (current_attachment_name, current_topic_key)
)
WITH (
  OIDS=FALSE
);

CREATE TABLE foswiki."Blob_Store"
(
  "value" text NOT NULL,
  "key" bytea NOT NULL,
  value_vector tsvector,
  CONSTRAINT blob_store_key PRIMARY KEY (key)
)
WITH (
  OIDS=FALSE
);

CREATE TABLE foswiki."Dataform_Data_History"
(
  "key" uuid NOT NULL,
  topic_history_key uuid NOT NULL,
  definition_key uuid NOT NULL,
  "values" bytea NOT NULL,
  CONSTRAINT dataform_history_key PRIMARY KEY (key),
  CONSTRAINT definition_relation FOREIGN KEY (definition_key)
      REFERENCES foswiki."Dataform_Definition_History" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT topic_relation FOREIGN KEY (topic_history_key)
      REFERENCES foswiki."Topic_History" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE
)
WITH (
  OIDS=FALSE
);

CREATE TABLE foswiki."Dataform_Definition_History"
(
  "key" uuid NOT NULL,
  "values" bytea NOT NULL,
  CONSTRAINT table_key PRIMARY KEY (key),
  CONSTRAINT topic_history_relation FOREIGN KEY ("key")
      REFERENCES foswiki."Topic_History" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE
)
WITH (
  OIDS=FALSE
);

CREATE TABLE foswiki."File_Store"
(
  "key" character(40) NOT NULL,
  file_blob oid NOT NULL,
  blob_store_key bytea,
  size integer NOT NULL,
  CONSTRAINT file_store_key PRIMARY KEY (key),
  CONSTRAINT blob_store_relation FOREIGN KEY (blob_store_key)
      REFERENCES foswiki."Blob_Store" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE
)
WITH (
  OIDS=FALSE
);

CREATE TABLE foswiki."Group_History"
(
  "key" uuid NOT NULL,
  group_name text NOT NULL,
  group_key uuid NOT NULL,
  email text,
  timestamp_epoch integer NOT NULL,
  user_key uuid NOT NULL,
  CONSTRAINT groups_key PRIMARY KEY (key),
  CONSTRAINT group_relation FOREIGN KEY (group_key)
      REFERENCES foswiki."Groups" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT user_relation FOREIGN KEY (user_key)
      REFERENCES foswiki."Users" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE
)
WITH (
  OIDS=FALSE
);

CREATE TABLE foswiki."Group_User_Membership"
(
  user_key uuid NOT NULL,
  group_key uuid NOT NULL,
  CONSTRAINT group_user_membership_key PRIMARY KEY (user_key, group_key),
  CONSTRAINT group_relation FOREIGN KEY (group_key)
      REFERENCES foswiki."Groups" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT user_relation FOREIGN KEY (user_key)
      REFERENCES foswiki."Users" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE
)
WITH (
  OIDS=FALSE
);


CREATE TABLE foswiki."Groups"
(
  "key" uuid NOT NULL,
  link_to_latest uuid DEFAULT '00000000-0000-0000-0000-000000000000'::uuid,
  group_topic_key uuid NOT NULL,
  site_key uuid NOT NULL,
  CONSTRAINT group_table_key PRIMARY KEY (key),
  CONSTRAINT group_history_relation FOREIGN KEY (link_to_latest)
      REFERENCES foswiki."Group_History" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT site_relation FOREIGN KEY (site_key)
      REFERENCES foswiki."Sites" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT group_topic_uniqueness UNIQUE (site_key, group_topic_key)
)
WITH (
  OIDS=FALSE
);


CREATE TABLE foswiki."Link_Types"
(
  link_type_key text NOT NULL,
  CONSTRAINT link_types_table_key PRIMARY KEY (link_type_key)
)
WITH (
  OIDS=FALSE
);


CREATE TABLE foswiki."Links"
(
  "key" uuid NOT NULL,
  topic_history_key uuid NOT NULL,
  destination_topic uuid DEFAULT '00000000-0000-0000-0000-000000000000'::uuid,
  destination_attachment uuid DEFAULT '00000000-0000-0000-0000-000000000000'::uuid,
  link_type text NOT NULL,
  destination_topic_history uuid DEFAULT '00000000-0000-0000-0000-000000000000'::uuid,
  destination_attachment_history uuid DEFAULT '00000000-0000-0000-0000-000000000000'::uuid,
  blob_key bytea,
  original_text text,
  CONSTRAINT links_key PRIMARY KEY (key),
  CONSTRAINT a_h_relation FOREIGN KEY (destination_attachment_history)
      REFERENCES foswiki."Attachment_History" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT attachment_relation FOREIGN KEY (destination_attachment)
      REFERENCES foswiki."Attachments" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT destination_topic_relation FOREIGN KEY (destination_topic)
      REFERENCES foswiki."Topics" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT source_relation FOREIGN KEY (topic_history_key)
      REFERENCES foswiki."Topic_History" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT t_h_relation FOREIGN KEY (destination_topic_history)
      REFERENCES foswiki."Topic_History" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT destination_not_null_check CHECK ('destination_topic'::text <> '00000000-0000-0000-0000-000000000000'::text OR 'destination_topic_history'::text <> '00000000-0000-0000-0000-000000000000'::text OR 'destination_attachment'::text <> '00000000-0000-0000-0000-000000000000'::text OR 'destination_attachment_history'::text <> '00000000-0000-0000-0000-000000000000'::text)
)
WITH (
  OIDS=FALSE
);


CREATE TABLE foswiki."MetaPreferences_History"
(
  "key" uuid NOT NULL,
  topic_history_key uuid NOT NULL,
  "type" text,
  "name" text NOT NULL,
  "value" text NOT NULL,
  CONSTRAINT metapreferences_history_key PRIMARY KEY (key),
  CONSTRAINT topic_history_relation FOREIGN KEY (topic_history_key)
      REFERENCES foswiki."Topic_History" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT topic_preference_uniqueness UNIQUE (name, topic_history_key)
)
WITH (
  OIDS=FALSE
);

CREATE TABLE foswiki."Site_History"
(
  "key" uuid NOT NULL,
  site_key uuid NOT NULL,
  site_name text NOT NULL,
  timestamp_epoch integer NOT NULL,
  user_key uuid NOT NULL,
  CONSTRAINT site_history_primary_key PRIMARY KEY (key),
  CONSTRAINT site_key FOREIGN KEY (site_key)
      REFERENCES foswiki."Sites" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT user_relation FOREIGN KEY (user_key)
      REFERENCES foswiki."Users" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE
)
WITH (
  OIDS=FALSE
);


CREATE TABLE foswiki."Sites"
(
  "key" uuid NOT NULL,
  link_to_latest uuid DEFAULT '00000000-0000-0000-0000-000000000000'::uuid,
  current_site_name text DEFAULT 'Need a real site name'::text,
  local_preferences uuid NOT NULL,
  default_preferences uuid NOT NULL,
  site_home uuid NOT NULL,
  admin_user uuid NOT NULL,
  admin_group uuid NOT NULL,
  system_web uuid NOT NULL,
  trash_web uuid NOT NULL,
  CONSTRAINT site_key PRIMARY KEY (key),
  CONSTRAINT admin_group_relation FOREIGN KEY (admin_group)
      REFERENCES foswiki."Groups" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT admin_user_relation FOREIGN KEY (admin_user)
      REFERENCES foswiki."Users" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT default_preferences_relation FOREIGN KEY (default_preferences)
      REFERENCES foswiki."Topics" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT link_to_latest_relation FOREIGN KEY (link_to_latest)
      REFERENCES foswiki."Site_History" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT local_preference_relation FOREIGN KEY (local_preferences)
      REFERENCES foswiki."Topics" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT site_home_relation FOREIGN KEY (site_home)
      REFERENCES foswiki."Topics" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT system_web_relation FOREIGN KEY (system_web)
      REFERENCES foswiki."Webs" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT trash_web_relation FOREIGN KEY (trash_web)
      REFERENCES foswiki."Webs" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT site_name_uniqueness UNIQUE (current_site_name)
)
WITH (
  OIDS=FALSE
);


CREATE TABLE foswiki."Topic_History"
(
  "key" uuid NOT NULL,
  topic_key uuid NOT NULL,
  user_key uuid NOT NULL,
  revision integer DEFAULT nextval('foswiki.topic_history_revision'::regclass),
  web_key uuid NOT NULL,
  timestamp_epoch integer NOT NULL,
  topic_content bytea NOT NULL,
  topic_name bytea NOT NULL,
  CONSTRAINT topic_history_key PRIMARY KEY (key),
  CONSTRAINT topic_key_relation FOREIGN KEY (topic_key)
      REFERENCES foswiki."Topics" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT user_relation FOREIGN KEY (user_key)
      REFERENCES foswiki."Users" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT web_relation FOREIGN KEY (web_key)
      REFERENCES foswiki."Webs" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE
)
WITH (
  OIDS=FALSE
);


CREATE TABLE foswiki."Topics"
(
  "key" uuid NOT NULL,
  link_to_latest uuid DEFAULT '00000000-0000-0000-0000-000000000000'::uuid,
  current_web_key uuid DEFAULT '00000000-0000-0000-0000-000000000000'::uuid,
  current_topic_name bytea NOT NULL,
  CONSTRAINT topic_key PRIMARY KEY (key),
  CONSTRAINT link_to_latest_relation FOREIGN KEY (link_to_latest)
      REFERENCES foswiki."Topic_History" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT topic_name_unique UNIQUE (current_web_key, current_topic_name)
)
WITH (
  OIDS=FALSE
);

CREATE TABLE foswiki."User_History"
(
  "key" uuid NOT NULL,
  first_name text,
  last_name text,
  login_name text NOT NULL,
  "cUID" text NOT NULL,
  "password" character varying NOT NULL,
  user_key uuid NOT NULL,
  change_user_key uuid NOT NULL,
  timestamp_epoch integer NOT NULL,
  email text,
  pin_number integer,
  CONSTRAINT users_key PRIMARY KEY (key),
  CONSTRAINT change_user_relation FOREIGN KEY (change_user_key)
      REFERENCES foswiki."Users" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT user_relation FOREIGN KEY (user_key)
      REFERENCES foswiki."Users" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT pin_number_range CHECK (0 < pin_number AND pin_number < 99999999)
)
WITH (
  OIDS=FALSE
);

CREATE TABLE foswiki."Users"
(
  "key" uuid NOT NULL,
  link_to_latest uuid DEFAULT '00000000-0000-0000-0000-000000000000'::uuid,
  current_login_name text DEFAULT 'name me something nice'::text,
  user_topic_key uuid NOT NULL,
  site_key uuid NOT NULL,
  CONSTRAINT "Users_key" PRIMARY KEY (key),
  CONSTRAINT user_history_relation FOREIGN KEY (link_to_latest)
      REFERENCES foswiki."User_History" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT site_login_name_uniqueness UNIQUE (site_key, current_login_name),
  CONSTRAINT user_topic_uniqueness UNIQUE (user_topic_key, site_key)
)
WITH (
  OIDS=FALSE
);


CREATE TABLE foswiki."Web_History"
(
  "key" uuid NOT NULL,
  web_key uuid NOT NULL,
  timestamp_epoch integer NOT NULL,
  user_key uuid NOT NULL,
  web_name text NOT NULL,
  CONSTRAINT web_history_key PRIMARY KEY (key),
  CONSTRAINT user_relation FOREIGN KEY (user_key)
      REFERENCES foswiki."Users" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT web_relation FOREIGN KEY (web_key)
      REFERENCES foswiki."Webs" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE
)
WITH (
  OIDS=FALSE
);


CREATE TABLE foswiki."Webs"
(
  "key" uuid NOT NULL,
  link_to_latest uuid DEFAULT '00000000-0000-0000-0000-000000000000'::uuid,
  current_web_name text DEFAULT 'Name me something nice'::text,
  site_key uuid NOT NULL,
  web_preferences uuid NOT NULL,
  web_home uuid NOT NULL,
  CONSTRAINT web_key PRIMARY KEY (key),
  CONSTRAINT link_to_latest_relation FOREIGN KEY (link_to_latest)
      REFERENCES foswiki."Web_History" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT web_home_relation FOREIGN KEY (web_home)
      REFERENCES foswiki."Topics" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT web_preference_relation FOREIGN KEY (web_preferences)
      REFERENCES foswiki."Topics" ("key") MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE,
  CONSTRAINT web_name_site_uniqueness UNIQUE (current_web_name, site_key)
)
WITH (
  OIDS=FALSE
);
CREATE TABLE foswiki.versions
(
  table_name text NOT NULL,
  table_version integer,
  CONSTRAINT table_name_key PRIMARY KEY (table_name)
)
WITH (
  OIDS=FALSE
);

SQL

Clustering

Backups

Replication

Comments

Hi Flavio,

Excellent initiative! Congratulations!

I'm very interested on this, because of performance gains we could get. Some developers are working on this (Sven? Crawford? Michael?) since a while.

Main performance bottlenecks are SEARCH and rendering. Moving foswiki data to a database could improve SEARCH a lot, taking advantage of database indexing capabilities, but only if the schema is optimized for it. Database would also be good to store and access preferences very fast.

Your proposed schema is very similar to the flat files: a query search would lead to scan and parse all dataform_data from all topics, the same action performed on flat files. Request Tracker is a great system that permits custom fields and it's schema to deal with this is good, but does not scale well for milions of records. An even faster way would be to make a table for each form, but it would be very dificult to mantain the tables. I'd try a schema like the one used on RT (it scales much more than flat files).

The schema should also be aligned to QueryAcrossTopicRevisions and any kind of query.

IMHO Foswiki should be database-agnostic, so it's necessary do develop a schema and queries that work on as many RDBMS as possible. There are some related topics: We surely should discuss the schema, avoiding duplicated work and pontentially achieving better results.

-- GilmarSantosJr - 18 Sep 2010

I did my DBI based (though initially tested with MySQL) Store in 2007-8 - before we moved to the FSA codebase and re architected the Store again.

however, as a design basis, I used the suggestions on the web about making large scale, multi-user tag databases, using a scema where the data table has one row per datum, where a formfield is a datum and the topic text is a datum and so are all the things like parent etc

So each topic has a number of rows that make up what is in the Meta obj, the data table only contains the current version, and then the history table would contain a txt file form of the topics - so going back in time was like using rcslite.

I'm now perusing MongoDB, but I am interested in examining the relative benefits.

-- SvenDowideit - 21 Sep 2010

In researching the whole "nosql" thing (I do think Foswiki topics+dataforms map pretty well to nosql datamodels), I recall seeing a note somewhere to say that if you use the schema Sven suggested, one should make use of database features to ensure that rows are ordered/grouped/localised in a way that avoids the DB having to do lots of random access for rows all over the DB just to get all the rows that belong to a topic.

-- PaulHarvey - 21 Sep 2010

Hm, not sure the above schema cuts it. For instance, Meta:Preferences are missing. How about a Meta table with a type field used for all kind of meta data of a topic, like meta:field, meta:preferences, meta:comment, meta:mycustomdata, etc.

There seems to be room for normalization. E.g. remove the Web-Topic-Member table and add a web field to the Topics table.

What about a comment field for history entries and attachments.

-- MichaelDaum - 21 Sep 2010

Note that the schema in Foswiki can be dynamically extended (using Foswiki::Func::registerMeta. Any DB solution has to take this into account, and support non-schema meta-fields.

Another reference you may want to look at is the DBCacheContrib schema, which has been in use for many years. Not that I would necessarily recommend it, but it is representative of experience.

-- CrawfordCurrie - 21 Sep 2010

Hi guys, thanks for all of the feed back. I have since made some updates to my schema.
  • @Meta issues: I would stuff those into a single field called meta for each topic and do a kind of hash list
  • @Dataform scalability issues: I think setting up a Berkely DB cache would be the best option on top of the sql db
  • @Nosql vs Sql: I don't really know what the wiki access characteristics are, so I think it would be difficult to design a Nosql solution (at least for me). For example, which data is read the most often or written the most often. At least with an SQL setup, one could see which data is being pulled the most. Also, you could make sql views and cache those instead of going the nosql route for those that are more comfortable with SQL.
-- FavioFlamingo - 24 Sep 2010

Hi guys, I updated my schema. I also finished up some of the code. I'll upload my code to the subversion server as soon as I can. I have been able to upload an rcs based wiki into the db. There are issues as well.

-- FavioFlamingo - 03 Oct 2010
 
Topic revision: r11 - 08 Apr 2011, AndrewJones
The copyright of the content on this website is held by the contributing authors, except where stated elsewhere. See Copyright Statement. Creative Commons License    Legal Imprint    Privacy Policy