> Generally relationships like the one you describe are stored in three
> separate and related tables: Students, Courses, and Enrollment. The
> latter is a n:m association between the first two. The advantage this
> approach has with regard to storage is that it is a sparse matrix.
I've done that and I'm playing around with the last one, this is where the
problem arise. It's a table with two columns, user id & the 'set' that
stores the enroll information. Since SQL doesn't have 'nice set data type'
(MySQL has it but it's restricted to 64 entries, and it's difficult to use),
I need to cover the problem from PHP side.
> Most students will only enroll in a handful of courses. With this
> approach, you only store a row in the Enrollment table if a student is
> enrolled in a course. Otherwise, you don't need to store anything.
Do you mean that, for example, if student A enrolls course x,y,z the table
would be:
user_id | course
-------+-------
A | x
A | y
A | z
Students often forget (or are lazy) to unenroll after they've finished
studying. Wouldn't the database be bloated? And what would be the primary
key?
> And no, 1.2MB is not that big of a deal. A single floppy high-density
> drive could hold that much data 18 years ago!
Yeah, but now I'm also considering the speed. So, I decided to build a class
that implements bitset operations and I'm gonna store the contents in
database as string. Here's the code:
class bitset {
private $bits;
private function index($bit) { return $bit / 32; }
private function offset($bit) { return $bit % 32; }
private function binstr() {
$temp_bits = $this->bits;
$str = "";
for ($i=0;$i<32;$i++) {
$str = strval($temp_bits & 1) . $str;
$temp_bits >>= 1;
}
return $str;
}
public function __construct() {
$this->bits = array(0,0,0,0,0,0,0,0);
}
public function tostring() {
$str = $this->binstr($this->bits[0]);
for ($i=1;$i<8;$i++)
$str .= "," . $this->binstr($this->bits[$i]);
return $str;
}
public function set($bit) {
$index = $this->index($bit);
$offset = $this->offset($bit);
$this->bits[$index] |= 1 << $offset;
}
public function clear($bit) {
$index = $this->index($bit);
$offset = $this->offset($bit);
$this->bits[$index] &= ~(1 << $offset);
}
public function test($bit) {
$index = $this->index($bit);
$offset = $this->offset($bit);
return $this->bits[$index] & (1 << $offset);
}
}
little problem: tostring() method always returns 00..001,00..001,..
regardless $bits contents. binstr() has been tested and works fine, what
might be wrong?
--
View this message in context:
http://www.nabble.com/optimizing-space-for-array-of-booleans-tp22159131p22196477.html
Sent from the PHP - General mailing list archive at Nabble.com.
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php