On Jan 30, 2006, at 1:45 PM, Allen Gilliland wrote:
I agree that is true *if* results are cached, but therein lies the problem.

I have spent quite a bit of time working on caching and performance in Roller and with our current setup it's not caching that is hard, it's having a big enough cache that's hard. The fact is that a blog takes up a lot of space because you have to consider caching entries, comments, bookmarks & folders, categories, referers, and templates. As a blog grows so do most of those things, especially the entries & comments. On top of just caching those objects we currently cache fully rendered pages and feeds, so that means a handful of xml feeds and quite a few full html pages. The point being, on a large site there is tons of data that needs caching already without having to cache tag related data.

Currently, I have no idea how we can expect to cache all the data that would be needed for a full tagging system along with everything else we cache right now.


Here are my thoughts on tags and tag search vs. caching

*** We can't cache everything

For example, if we allow people to perform arbitrary tag queries
via the Roller UI, we're not going be able to cache the results.
In that case, we're probably OK. After all, how many people
are going to be doing tag searches on a Roller site simultaneously.

*** Tag based newsfeeds are where the problem arises

The problem arises when we start to allow people to subscribe
to tag searches. In that case, we'll have newsfeed readers and
aggregators hammering away hourly night and day. What's
worse, the number of feeds will go to infinity.

And we already have too many feeds:
total feeds = (number of blogs) X (cats per blog) X (2 feed types Atom and RSS)

So...

*** We should allow admins to disable tag based newsfeeds

We should allow arbitrary tag searches and getting the results as
newsfeeds, but we should also make it possible to turn both of those
off via Roller properties or the UI.

*** We should allow admins to define a finite list of site-wide feeds

What I'd like to do with Proposal Atlas is provide a way for a site
administrator to decide what feeds are to be displayed on the front
page of a Roller site and define a finite list of feeds to be provided
based on aggregations, tags, and internal objects (e.g. new user
and new blog feeds). The I'll have a new rev. of the proposal ready
in the next day or two.

- Dave




On Mon, 2006-01-30 at 07:07, John Hoffmann wrote:
I'd just like to add that performing joins in sql is not something to be avoided, the impact can be almost completely mitigated by caching the results. The only real cause for concern is for truly massive datasets in which the join cannot be performed in the amount of memory available
to the database.

-John

Allen Gilliland wrote:

I don't want to lose this thread because I think there are still some ideas to continue flushing out. More comments inline ...

On Fri, 2006-01-13 at 05:14, David Levy wrote:


Sorry to have taken so long.

The denormalisations of the author_name (which may be owner name) and entrydate are to support queries. This is because I expect a macro to create a tag cloud for a user so that the html versions can have the tag
cloud,

So

select normal_tag_name, count(*)
from entry2tags
where author_name = "DaveLevy"
group by normal_tag_name

gives us the data required for a tag cloud, for a single blog . No join
as you can see, where it gets fun is if you want a hot tags cloud

we add a line so the query becomes

select normal_tag_name, count(*)
from entry2tags
where author_name = "DaveLevy"
and     entry_date > @sevedaysago
group by normal_tag_name



very cool stuff ... i like the looks of that.

... lots of stuff chopped out here ...



is there a reason to copy down the entry_date rather than access it via a join on the weblogentry table? you can join with the weblogentry table using the entry_id column. how were you planning to use the entry_date field?




see above, I don't want to join to the entry table, and this goal also
impacts my index design.  entry_date allows hot tags queries to be
driven by the entry not the tagged date



ok. I agree that joins are a likely performance problem, but my next question then becomes ... How do we plan to deal with getting the data for the list of entries marked with a given tag? I am expecting that when someone uses the tag dashboard or a tag cloud to try and view a list of entries with the tag "foo", that list will look something like the Roller front page. example ...

url = /roller/tag/entries/java+netbeans

you then populate a page with 50? 25? entry summaries for people to browse through and those summaries will at least require the entry title and a summary of the entry content and may also require the entry date, category, author, and weblog title. I would think we are going to require a join to get that data.



what acts as the primary key? (author_name, entry_id, user_tag_name)?



my PK is author_name, entry_id and normal_tag_name



we may still need to use a surrogate key to uniquely identify the row to avoid having a multi column primary key.



yeah, looks like it



i'm not sure that would be much of an issue though because it doesn't look like you are planning for any joins for the tag names, correct?





I'm trying to avoid any joins, but if you are looking for entries on a
blog and tagged, then it would be good to enter the query on
author_name, but since we have not copied the title down to the
entry2tags table we still need the join and can go in on author_name on
either table, but best do it on entry table (see below).

select  entry.title
from    entry, entry2tags e2t
where e2t.entry_id = entry.id
and     entry.author_name = @KnownName
and     e2t.normal_tag_name in (@TagQueryList)



based on my example above, how would we get the necessary entry data when we don't know the author name because we are searching through the entire tag system, not just from a single author or weblog?

-- Allen




Right, Allen. This is very similar to what we already have. I'm not sure why having author name here, when we already have that through a join
with the entry_id.



That's right, but I don't want to join, the entry2tags table is big
enough without joining.



I'm not sure why do we need entry_date when we have
the tagging date.



I think the queries should be driven through the entry publication date.



I do like the normal tag name. I was thinking this too for the output of the Porter Stemming algorithm so I wouldn't lose the original information entered by the user. Everything else is the same :-).




I need to read your references to understand this, but I think you agree
this is OK



Another point I want to make is the fact, that we do a little bit of extra processing when saving an existing entry that make sure it keeps the original date for each tag. For example, when I first created an entry I tagged it A,B,C. The first time I edited, I removed B. The A and C tags will retain the dates when they were added as opposed to the edit
date.




Are you holding entry_tag data on the entry table?



Additionally, we have a question of what to do with spaces. Should tags be multi-word or not? My suggestion to Phay (one of our developers) was to use spaces as separators in the input field, therefore not supporting
spaces. But we could do multiple things to support spaces, such as
quoting multi-word tags. I believe Flickr supports multi-words but they remove the spaces from the tags, but technorati does maintain spaces. I don't like them myself, because I think it fragments the tag space much more than single words and you could still use intersections to get the
sort of the same result.






create constraint defined_tags_name as
  normal_tag_name=proper(user_tag_name)

create constraint defined_tags_entry_date as
  entry_date = select entry_date from entry
where definedtags.entry_name = entry.entry_name

and the following indexes

create dt.tags on definedtags
  as author_name, entry_name, normal_tag_name unique




This is the real primary key



create dt.tags2 on definedtags
  as normal_tag_name




This is the tag entity (or operational master)



create dt.entries on definedtags
  as author_name, entry_name

create dt.date_written
  on definedtags as entry_date.

I have written this in a hurry so it may not be though out as well as some of my writing, but hopefully this is collaborative development.
Also I have difficulty in commenting on and reading some of the
front-end & java orientated stuff. (I have ordered a couple of books to
help me catchup). Hopefully this is helpfull





I think this all makes sense to me so far and I certainly appreciate the help. I think getting the data model correct is a *very* important issue before we move forward with implemenatation, so I'm glad we are having this discussion.

-- Allen




[1] http://www.tartarus.org/~martin/PorterStemmer/def.txt
[2] http://torrez.us/archives/2005/07/13/tagrank.pdf





Elias Torres wrote:





Welcome David to the Roller list.

Thank you for your post. I have read your blog post on a tag data model for Roller. I'm looking forward to your relational algebra and query cost analysis. I wanted to tell you that we (IBM) have already added basic tagging support to Roller and it actually supports a TagCloud. I am supposed to put a proposal in the roller wiki so others could comment and once I do that, you could put your comments there as
well.

Just to kickstart the conversation I'm including the tagging table we
are currently using.

create table weblogentrytag (
 id              varchar(48)   not null primary key,
 entryid        varchar(48)   not null,
 name            varchar(255)  not null,
 tagtime         timestamp     not null
);

We have basically two tables: entries and entry2tags, but are missing a tag table. At first, I was very set on having a tag table and use a foreign key to "save" space on repetitive tag names. But I was shown it's not really a big space saving technique, especially since tag names are relatively short storing a guid or int would almost be comparable in space. There are also increased costs in inserting and joining on tables to get tag names if using a foreign key, so we have settle on this for now until we have other queries requirements. I'll be summarizing all of our changes to roller to support tagging in a
wiki proposal soon.

Regarding the use of the list, some people have been using nabble.com to interact with it. Maybe you can give it a try. I simply use gmail.

http://www.nabble.com/Roller-f12275.html

Regards,

Elias

On 1/4/06, David Levy <[EMAIL PROTECTED]> wrote:






I have documented a data model for tags. This is held at my blog

http://blogs.sun.com/roller/page/DaveLevy? entry=implementing_tags_in_a_database

I have a graphic demonstrating the relationship between authors, articles and tags and illustrating the first and obvious indexes. (I have identified that both "Date Published" and tag aggregates are
missing from the model).  Since the model was built to help me
understand del.icio.us, I call the entities Users, Bookmarks and Tags, but hopefully its simple to see that these are pretty synonomous to
authors, articles and tags.

I hope that this is useful for those looking at implementing tags.

I am still working out how to use the mail-list, so I hope that x-refing you to my blog isn't deprecated. I also need to work how to maintain thread connections i.e. undertake a reply.
--

Dave




--

Dave









--

Dave

<http://www.sun.com>      * David Levy *






Blog http://blogs.sun.com/DaveLevy
Email [EMAIL PROTECTED]

Sun Proprietary & Confidential . This e-mail message is for the sole use
of the intended recipient(s) and may contain confidential and
privilidged information. Any unauthorised review, use, disclosure or
distribution is prohibited. If you are not the intended recepient,
please contact the sender by reply e-mail and destroy all copies of the
original message.








Reply via email to