Solved

Best way to handle SETS in SQL SERVER 2008 R2

Posted on 2015-02-10
6
117 Views
Last Modified: 2015-02-10
I have two tables. One represents a person, and another is a one-to-many child table that has certain characteristics of that person. Each person can have 0, 1 or many characteristics.  

create table people (id int, name varchar(25));
insert people (id, name) VALUES (1, 'Scott'), (2, 'Joe');

create table characteristics (characteristic int, characteristic_text varchar(25));
insert characteristics (characteristic, characteristic_text) VALUES
(1, 'Fat'), (2, 'Skinny'), (3, 'Ugly'), (4, 'Toothsome');

create table people_characteristics (person int, characteristic int);
insert people_characteristics (person, characteristic) VALUES
(1, 1), (1, 3), (2, 4);

Open in new window


So here is the question. I have a web page where people update the characteristics and the results are submitted in a form using a multi-select. When users make changes, I delete all the old values and replace them with the new ones, like this

delete from people_characteristics where person=1;
insert people_characteristics (person, characteristic) VALUES
(1, 1), (1, 2);

Open in new window


This strikes me as painfully inefficient. Does SQL Server have any other way to manage a set of boolean values? I understand that if I was truly enterprising, I could assign each characteristic a power of two and then store a sum, but I am looking for an extensible (i.e. easy) way of doing this.

Here's a fiddle http://sqlfiddle.com/#!3/df792/1
0
Comment
Question by:mankowitz
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
6 Comments
 
LVL 143

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 40600573
this is the normalized way of doing it.
any other method is not really normalized, but then, it might not be the most efficient in regards to queries ...

now, in your "update" you "delete all + insert all" ... you could consider to delete only those that are not set anymore, and insert new ones.
however, in terms of efficiency, if you have that table in sql server with a clustered index on the personid, this will touch 1 page block at max, and hence be the most efficient solution for that part.

for the queries (to find all persons matching a certain "profile", you might consider adding a denormalized version of those settings on the person table, using for example some XML field (which could be indexed eventually)

it depends on the usage of those "settings/properties"
0
 
LVL 66

Expert Comment

by:Jim Horn
ID: 40600578
It might make more sense to use updatable recordset objects in your front-end, and then just update, instead of an DELETE-INSERT.

What front-end are you using, and I recommend adding that zone to this question.

>Does SQL Server have any other way to manage a set of boolean values?
Nothing optimized for boolean data types.
0
 
LVL 24

Author Comment

by:mankowitz
ID: 40600627
for the time being, the scope of the project is pretty small. It includes the editing of various characteristics (as above) and running a monthly report showing the aggregate number of each of the characteristics in the community. In other words, how many fat people, how many ugly people for each month.

The front end is PHP, but I'm not sure that helps. For example, If I stored an object in the master table, I could accomplish my changes with a single update

UPDATE people SET characteristics='3,6,22,66' WHERE id=3

The problem with that is that my monthly query would be slower - something like this:

SELECT ....
WHERE characteristics like '%'+c.characteristic+'%'
FROM people p CROSS JOIN characteristics c
0
 
LVL 143

Accepted Solution

by:
Guy Hengel [angelIII / a3] earned 500 total points
ID: 40600651
As I wrote: better go the normalized way: then both the reporting and the OLAP queries will run just fine.
for the monthly reporting you may consider doing a copy of the actual table away to a dedicated reporting db, so any reporting will not pull the resources from the production database.
0
 
LVL 24

Author Closing Comment

by:mankowitz
ID: 40602162
I was hoping for an easy analog of MySQL's SET type, but no luck.
0

Featured Post

Get 15 Days FREE Full-Featured Trial

Benefit from a mission critical IT monitoring with Monitis Premium or get it FREE for your entry level monitoring needs.
-Over 200,000 users
-More than 300,000 websites monitored
-Used in 197 countries
-Recommended by 98% of users

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

3 proven steps to speed up Magento powered sites. The article focus is on optimizing time to first byte (TTFB), full page caching and configuring server for optimal performance.
When it comes to protecting Oracle Database servers and systems, there are a ton of myths out there. Here are the most common.
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…

705 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question