سؤال

لدي طاولة مع حقل فريد من نوعه فارغة (512). أريد أن أحمل طاولة أخرى إشارة مفاتيح أجنبية إلى هذا الطاولة الأولى. كلا الجداول استخدام InnoDB. إذا أضفت مفتاح Varchar (512) إلى الجدول الثاني وإضافة قيود مفتاح أجنبي، فسيتم إجراء بيانات طويلة من 512 بايت مرتين؟

إذا كان الأمر كذلك، فهل هناك طريقة لعقد فقط إشارة إلى الفهرس وليس إلى varchar نفسه؟

باختصار، سؤالي هو، في InnoDB هل هناك طريقة فعالة لعقد مفاتيح أجنبية لحقول طويلة فارغة؟

شكرا جزيلا،

يانيف

هل كانت مفيدة؟

المحلول

نعم، إذا كان لديك VARCHAR(512) العمود في الجدول المرجعية، ستكون البيانات موجودة مرتين.

أوصي بأن تجعل مفتاح الجدول الأجنبي المرجعية يشير إلى مفتاح أساسي عدد صحيح للجدول الأول، وليس بيانات 512 بايت. هذا نوع من التطبيع هو كل شيء.

نصائح أخرى

ركضت اختبارا بسيطا: إنشاء 3 طاولات، واحدة لعقد البيانات نفسها مع عمودين، ومعرف (int) والبيانات (varchar [120])، جدول آخر يستخدم المعرف كجزء أجنبي وآخر يستخدم البيانات ككل مفتاح:

CREATE TABLE `dados` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(120) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`) USING BTREE,
  KEY `idx` (`id`,`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `refINT` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `dado` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `id` (`dado`),
  CONSTRAINT `id` FOREIGN KEY (`dado`) REFERENCES `dados` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `refSTR` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `dado` varchar(120) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `nome` (`dado`),
  CONSTRAINT `nome` FOREIGN KEY (`dado`) REFERENCES `dados` (`name`) ON DELETE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

إدراج 100 سجل في كل طاولة مقارنة بحجم الجدول النهائي:

dados:  192.0 KB
refINT: 32.0 KB
refSTR: 32.0 KB

لذلك أعتقد أن البيانات غير متكررة في مفتاح Varchar الأجنبي، حسنا، على الأقل في إصدار MySQL 5.1.

الحفاظ على حجم المفتاح صغير هو دائما جيدة. يمكنك الحصول على مشكلة وجود كبير VARCHAR مفهرسة من خلال بدلا من ذلك وجود عمود الاختباري الإضافي الذي تولده في وقت الإدراج. سيحتوي مجال الاختباري هذا على إخراج خوارزمية التجزئة CRC32() أو ربما MD5() من العمود الأكبر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top