سؤال

هذه المشكلة ضربتني غريب بعض الشيء. أنا فضولي كيف يمكن أن تمثل قائمة بالأرقام الرئيسية في قاعدة البيانات. لا أعرف من نوع من نوع واحد من شأنه أن يكون قادرا على تخزين كمية كبيرة من الأرقام الكبيرة. قلقي هو أنه عندما تبدأ الأرقام الأولية في احتواء 1000s من الأرقام، فقد يكون من الصعب بعض الشيء أن نشدد قاعدة البيانات. هل هناك طريقة لتمثيل مجموعة كبيرة من الأعداد الأولية في DB؟ أنا متأكد تماما من أن هذا لديه موضوع قد اقترب منه من قبل.

واحدة من المشكلات حول هذا الأمر الذي يجعل من الصعب هو أن الأرقام الأولية لا يمكن تقسيمها إلى العوامل. إذا كان بإمكانهم هذه المشكلة سيكون أسهل بكثير.

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

المحلول

إذا كنت ترغب حقا في تخزين الأعداد الأولية كأرقام وواحدة من الأسئلة، فإن إيقاف تشغيلك "أرقام رئيسية لا يمكن تقسيمها إلى عوامل"، وهناك شيء آخر: قم بتخزينه في قائمة المعامل بأي رقم مطلوب بواسطة التسلسل.

مثال صغير:

2831781 == 2*100^3 + 83*100^2 + 17*100^1 + 81*100^0

القائمة هي:

81, 17, 83, 2

في التطبيق الحقيقي مفيد تقسيم بواسطة Modulus من 2 ^ 32 (أعداد صحيحة 32 بت)، خاصة إذا كانت الأرقام الرئيسية في معالجة التطبيق المخزنة كصفيفات بايت.

التخزين في DB:

create table PRIMES
(
  PRIME_ID         NUMBER not null,
  PART_ORDER       NUMBER(20) not null,
  PRIME_PART_VALUE NUMBER not null
);

alter table PRIMES 
add constraint PRIMES_PK primary key (PRIME_ID, PART_ORDER) using index;

أدخل على سبيل المثال أعلاه (1647 هو على سبيل المثال فقط):

insert into primes(PRIME_ID, PART_ORDER, PRIME_PART_VALUE) values (1647, 0, 81);
insert into primes(PRIME_ID, PART_ORDER, PRIME_PART_VALUE) values (1647, 1, 17);
insert into primes(PRIME_ID, PART_ORDER, PRIME_PART_VALUE) values (1647, 2, 83);
insert into primes(PRIME_ID, PART_ORDER, PRIME_PART_VALUE) values (1647, 3, 82);

يمكن تعيين قيمة Prime_ID من تسلسل أوراكل ...

create sequence seq_primes start with 1 increment by 1;

احصل على معرف الرقم الرئيسي التالي لإدراج:

select seq_primes.nextval from dual;

حدد محتوى الأرقام الأول مع معرف محدد:

select PART_ORDER, PRIME_PART_VALUE 
from primes where prime_id = 1647 
order by part_order

نصائح أخرى

يمكنك تخزينها كبيانات ثنائية. لن يكونوا مقروء بشريين مباشرة من قاعدة البيانات، لكن لا ينبغي أن يكون مشكلة.

يمكن لقواعد البيانات (اعتمادا على أي) تخزين أرقام تصل روتينا إلى 38-39 رقما بدقة. هذا يجعلك بعيدا بشكل معقول.

أبعد من ذلك أنك لن تقوم بعمليات حسابية عليها (بدقة) في قواعد البيانات (باستثناء الوحدات التعسفية الدقة التي قد تكون موجودة لقاعدة بيانات خاصة بك). ولكن يمكن تخزين الأرقام كنص يصل إلى عدة آلاف من الأرقام. بعد ذلك يمكنك استخدام حقول Clob Type لتخزين الملايين من الأرقام.

كما أنه لا يستحق أي شيء إذا كنت تخزن تسلسلات من الأعداد الأولية واهتمت اهتمامك في ضغط الفضاء هذا التسلسل الذي يمكنك أن تبدأ عن طريق تخزين الفرق بين رقم واحد والآخر وليس الرقم بالكامل.

هذا غير فعال بعض الشيء، ولكن يمكنك تخزينها كسلاسل.

إذا كنت لن تستخدم حسابات جانبية قاعدة البيانات مع هذه الأرقام، فقد قمت فقط بتخزينها بتسلسلات بتنسيتها الثنائية (BLOB, VARBINARY إلخ.)

ها هي بلدي 2 سنتا يستحق. إذا كنت ترغب في تخزينها كأرقام في قاعدة بيانات، فسيتم تقييدها بالحجم الحد الأقصى لعدد صحيح أن قاعدة البيانات الخاصة بك يمكن التعامل معها. من المحتمل أنك تريد جدول عمود 2، مع الرقم الرئيسي في عمود واحد، وهو رقم التسلسل في الآخر. ثم تريد أن تجعل بعض الفهارس العثور على القيم المخزنة بسرعة.

لكنك لا تريد حقا القيام بذلك، فأنت تريد تخزين HUBONGOUS (SP؟) الأبعاد، أي نوع من نوع بيانات عدد صحيح لديك حتى الآن. وأنت تقول أنك تتكرر السلاسل بحيث تكون البيانات الثنائية بالنسبة لك. (سيكون من أجلي أيضا.) نعم، يمكنك تخزينها في شريط في قاعدة بيانات ولكن ما هو نوع المرافق التي ستقدم لك DBMS لإيجاد رئيس N-TH أو التحقق من عنوان عدد صحيح مرشح؟

كيفية تصميم هيكل ملف مناسب؟ هذا هو أفضل ما يمكنني التوصل إليه بعد حوالي 5 دقائق التفكير:

  1. تعيين عداد إلى 2.
  2. اكتب الجزءتين الذي يمثل الرقم الأول الأول.
  3. اكتبها مرة أخرى، لتمييز نهاية القسم الذي يحتوي على الأعداد الأولية 2 بت.
  4. تعيين العداد إلى مكافحة + 1
  5. اكتب الأعداد الأولية 3 بت من أجل. (أعتقد أن هناك اثنين: 5 و 7)
  6. اكتب آخر الأعداد الأولية 3 بت مرة أخرى لوضع علامة على نهاية القسم الذي يحتوي على الأعداد الأولية 3 بت.
  7. العودة إلى 4 واتقام على Mutatis Mutandis.

النقطة حول كتابة آخر n-bit prime مرتين هو تزويدك بوسيلة لتحديد نهاية الجزء من الملف مع الأعداد الأولية N-BIT عندما تأتي لقراءة الملف.

أثناء كتابة الملف، ربما ترغب أيضا في إجراء علما بالإزاحة في الملفات في نقاط مختلفة، وربما بداية كل قسم يحتوي على الأعداد الأولية N-BIT.

أعتقد أن هذا سيعمل، وسوف يتعامل مع الأعوام حتى 2 ^ (أكبر عدد صحيح غير موقعة يمكنك تمثيله). أعتقد أنه سيكون من السهل بدرجة كافية لإيجاد رمز لترجمة قيمة 325467 بت (قل) في عدد صحيح كبير.

بالتأكيد، يمكنك تخزين هذا الملف كقيمة بلوب لكنني لست متأكدا من السبب في أن كنت تهتم.

كل هذا يتوقف على أنواع العمليات التي تريد القيام بها مع الأرقام. إذا قمت بالتخزين والبحث فقط، فما عليك سوى استخدام السلاسل واستخدام التحقق من أنواع DECORD / DOMONEYPE لفرض أرقام. إذا كنت تريد المزيد من التحكم، فسيسمح لك postgresql بتحديد أنواع البيانات المخصصة والوظائف. يمكنك على سبيل المثال واجهة مع بخاصة المكتبة للحصول على الطلب الصحيح والحساقة للأعداد الصحيحة الدقة التعسفي. سيتيح لك استخدام مثل هذه المكتبة تنفيذ قيود فحص يستخدم اختبار البدادة الاحتمالية للتحقق مما إذا كانت الأرقام حقا رئيسية.

السؤال الحقيقي هو في الواقع ما إذا كانت قاعدة البيانات العلائقية هي الأداة الصحيحة للمهمة.

أعتقد أنك أفضل حالا باستخدام Blob. كيف يتم تخزين البيانات في Blob يعتمد على الاستخدام المقصود للأرقام. إذا كنت ترغب في استخدامها في العمليات الحسابية، فأنا أعتقد أنك ستحتاج إلى إنشاء فئة أو اكتب لتخزين القيم كأعلى متنوعة من القيمة الثنائية المطلوبة والسماح لها بمعالجة الأرقام، وما إلى ذلك. إذا كنت بحاجة فقط لعرضها بعد ذلك تخزينها كسلسلة من الأحرف ستكون كافية، وسوف تقضي على الحاجة إلى تحويل قيمك الحسابية إلى شيء ما يمكن عرضه، والذي يمكن أن يكون وقتا طويلا للغاية بالنسبة للقيم الكبيرة.

مشاركة واستمتع.

ربما ليس رائعا، ولكن ماذا لو قمت بتخزينها في بعض هيكل البيانات العودية. يمكنك تخزينها باعتبارها كثيرة، ومن الأسهم، والرجوع إلى أرقام البت السفلى.

مثل فكرة السلسلة، ربما لن تكون جيدة جدا لاعتبارات الذاكرة. وسيتم زيادة وقت الاستعلام بسبب الطبيعة المتكررة للاستعلام.

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