PDA

View Full Version : انتخاب بین افزونگی داده و Join



p_ooya
چهارشنبه 04 شهریور 1388, 21:45 عصر
سلام به همه.
دو جدول زیر را در نظر بگیرید :
CREATE TABLE `tm`.`archive` (
`serial` char(14) collate utf8_persian_ci NOT NULL,
`archive_number` tinyint(3) unsigned NOT NULL,
`date_f` char(10) collate utf8_persian_ci default NULL,
`date_p` char(10) collate utf8_persian_ci NOT NULL,
`date_s` char(10) collate utf8_persian_ci default NULL,
`state` tinyint(3) unsigned NOT NULL,
`s_id` int(10) unsigned default NULL,
`i_id` int(10) unsigned default NULL,
PRIMARY KEY (`serial`),
KEY `FK_archive_1` (`s_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci;
و
CREATE TABLE `tm`.`arctoarc` (
`serial` char(14) COLLATE utf8_persian_ci NOT NULL,
`arc_no1` tinyint(3) unsigned NOT NULL,
`date1` char(10) COLLATE utf8_persian_ci NOT NULL,
`arc_no2` tinyint(3) unsigned NOT NULL,
`date2` char(10) COLLATE utf8_persian_ci NOT NULL,
`arc_no3` tinyint(3) unsigned NOT NULL,
`date3` char(10) COLLATE utf8_persian_ci NOT NULL,
PRIMARY KEY (`serial`),
CONSTRAINT `FK_arcTOarc_1` FOREIGN KEY (`serial`) REFERENCES `archive` (`serial`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci;
همونطور که می بینید این دو جدول از طریق فیلد سریال با هم یه ارتباط یک به یک (یا صفر) دارند. برای اکثر سریال ها، سطر های جدول دوم null هستند و شاید 5 درصد سریال ها در این جدول دوم سطر خواهند داشت. جدول اول ما در نهایت 1 میلیون رکورد خواهد داشت و همونطور که گفتم 5 درصد این رکوردها در جدول دوم نماینده دارند. سوال اینجاست که از اونجایی که روی این دو جدول پرس و جو زیاد انجام میشه و پرس و جو هم همگی باید روی Join این دو جدول انجام بشه، با توجه به حجم 1 میلیونی داده، بهتر نیست که دو جدول رو یکی کنم و این حجم داده null رو قبول کنم اما پرس و جو ها رو بدون الحاق انجام بدم؟

سپاس.

p_ooya
شنبه 07 شهریور 1388, 22:34 عصر
ببخشید که من این تاپیک رو به این صورت در معرض دید قرار می دم اما جواب سوال برام بسیار مهمه.

p_ooya
یک شنبه 05 مهر 1388, 18:20 عصر
خواهش می کنم بعد از 1 ماه یه جوانمردی این سوال پیش پا افتاده ما رو جواب بده.

حامد مصافی
یک شنبه 05 مهر 1388, 18:22 عصر
ارتباط یک-به-یک نداریم!!! به جای این ارتباط فیلد(هایی) به جدول اصلی باید اضافه شوند. این به معنی افزونگی نیست.

AminSobati
دوشنبه 06 مهر 1388, 18:03 عصر
سلام دوست عزیزم،
بستگی به بانک اطلاعاتی شما داره. مثلا در SQL Server 2008 فیلدی که ممکنه Null زیاد داشته باشه میتونین با خاصیت Sparse تعریف کنید که برای Null هیچ فضایی اشغال نمیکنه. در کل این تفکیک صرفا به خاطر داشتن Null مزیت مهمی نیست، من ترجیح میدم Null داشته باشم. چون به قول فرنگی ها:
Disk Space is Cheap, Join is expensive