রেল কলামের ধরণের জন্য কি ডকুমেন্টেশন আছে?


181

আমি এই পৃষ্ঠায় সন্ধান করা সহজ ধরণের তালিকার চেয়ে আরও বেশি খুঁজছি :

: প্রাথমিক_কি,: স্ট্রিং,: পাঠ্য,: পূর্ণসংখ্যা,: ভাসা,: দশমিক,: তারিখ সময়,: টাইমস্ট্যাম্প, সময়,: তারিখ,: বাইনারি,: বুলেট

কিন্তু এমন কোনও ডকুমেন্টেশন রয়েছে যা এই ক্ষেত্রগুলিকে প্রকৃতপক্ষে সংজ্ঞায়িত করে?

বিশেষ করে:

  • মধ্যে পার্থক্য কি :stringএবং :text?
  • এর মধ্যে :floatএবং :decimal?
  • এর পার্থক্য বৈশিষ্ট্য কী কী :time, :timestampএবং :datetime?

এই ধরনের সংক্ষিপ্ত বিবরণ কোথাও নথিভুক্ত করা হয়?

সম্পাদনা: ডিবি-প্ল্যাটফর্ম বাস্তবায়নের পয়েন্টগুলি আমি যে প্রশ্নটি জিজ্ঞাসা করতে চাইছি তার সাথে অপ্রাসঙ্গিক। যদি, বলুন, :datetimeরেল ডকুমেন্টেশনের কোনও সংজ্ঞায়িত অর্থ নেই, তবে ডিবি-অ্যাডাপ্টার-লেখকেরা কি সংশ্লিষ্ট কলামের প্রকারটি বেছে নেওয়ার পরে যান?


1
এই ধরণের কী কী, আমার পছন্দের শব্দ, জিনিস , যা বলা বলা হয়? লাইক, তারা ক্ষেত্র বা বৈশিষ্ট্য বা কি। আমি অন্য অনুসন্ধানের জন্য ছিল কিছু আর অন্য :stringএবং :textএবং আমি এই ছাড়া অন্য খুঁজে পাইনি। সুতরাং, আমি কেবল ভবিষ্যতের রেফারেন্সের জন্য ভাবছিলাম।
l1zZY

2
@ l1zZY, ​​আপনি যে শব্দটির সন্ধান করতে পারেন তা হ'ল "ডেটা ধরণের"।
thatpaintingelephant

উত্তর:


397

ব্যক্তিগত অভিজ্ঞতা থেকে নির্মিত গাইডলাইনস:

  • স্ট্রিং :
    • 255 টি অক্ষরে সীমাবদ্ধ (DBMS এর উপর নির্ভর করে)
    • সংক্ষিপ্ত পাঠ্য ক্ষেত্রগুলির জন্য ব্যবহার করুন (নাম, ইমেল ইত্যাদি)
  • পাঠ্য :
    • সীমাহীন দৈর্ঘ্য (ডিবিএমএসের উপর নির্ভর করে)
    • মন্তব্য, ব্লগ পোস্ট ইত্যাদির জন্য ব্যবহার করুন থাম্বের সাধারণ নিয়ম: যদি এটি টেক্সেরিয়ার মাধ্যমে ধরা হয় তবে পাঠ্যটি ব্যবহার করুন। পাঠ্যক্ষেত্র ব্যবহার করে ইনপুট দেওয়ার জন্য স্ট্রিং ব্যবহার করুন।
  • পূর্ণসংখ্যা :
    • পুরো সংখা
  • ভাসা :
    • দশমিক সংখ্যাগুলি ভাসমান পয়েন্ট যথার্থতার সাথে সঞ্চিত
    • যথার্থতা স্থির করা হয়েছে, যা কিছু গণনার জন্য সমস্যাযুক্ত হতে পারে; সাধারণত সঠিকভাবে গোল করার কারণে গণিতের ক্রিয়াকলাপের পক্ষে ভাল নয়।
  • দশমিক :
    • নির্ভুলতার সাথে সঞ্চিত দশমিক সংখ্যা যা আপনার গণনার দ্বারা প্রয়োজন অনুসারে পরিবর্তিত হয়; এগুলি গণিতের জন্য ব্যবহার করুন যা সঠিক হওয়া দরকার
    • উদাহরণগুলির জন্য এই পোস্টটি দেখুন এবং ভাসমান এবং দশমিকের মধ্যে পার্থক্য সম্পর্কে গভীরতর ব্যাখ্যা।
  • বুলিয়ান :
    • সত্য / মিথ্যা বৈশিষ্ট্যগুলি সংরক্ষণ করার জন্য ব্যবহার করুন (যেমন জিনিসগুলি কেবল দুটি স্থানে থাকে যেমন চালু বা বন্ধ থাকে)
  • বাইনারি :
    • ছবিগুলি, চলচ্চিত্রগুলি এবং অন্যান্য ফাইলগুলিকে তাদের মূল, কাঁচা বিন্যাসে ব্লবস নামক তথ্যের অংশে সঞ্চয় করতে ব্যবহার করুন
  • : primary_key
    • এই ডেটাটাইপটি এমন এক স্থানধারক যা আপনার পছন্দসই ডাটাবেসের পছন্দ অনুসারে প্রাথমিক কী ডেটাটাইপগুলিতে অনুবাদ করে serial primary keyরেলগুলি (যেমন পোস্টগ্রিজ এসকিউএল)। এর ব্যবহার কিছুটা জটিল এবং প্রস্তাবিত নয়।
    • মডেল এবং মাইগ্রেশন সীমাবদ্ধতাগুলি ব্যবহার করুন ( বিকল্প হিসাবে পছন্দ করুন validates_uniqueness_ofএবং এর add_indexসাথে :unique => true) এর পরিবর্তে আপনার নিজের ক্ষেত্রের একটিতে প্রাথমিক কী কার্যকারিতা সীমাবদ্ধ করুন।
  • তারিখ :
    • কেবলমাত্র একটি তারিখ (বছর, মাস, দিন) সঞ্চয় করে
  • সময় :
    • কেবলমাত্র এক সময় স্টোর (ঘন্টা, মিনিট, সেকেন্ড)
  • তারিখ সময় :
    • তারিখ এবং সময় উভয়ই সঞ্চয় করে
  • টাইমস্ট্যাম্প
    • তারিখ এবং সময় উভয়ই সঞ্চয় করে
    • দ্রষ্টব্য: রেলগুলির উদ্দেশ্যে, টাইমস্ট্যাম্প এবং ডেটটাইম উভয়ই একই জিনিস (উভয় তারিখ এবং সময় সংরক্ষণের জন্য টাইপ ব্যবহার করুন)। টিএল; ডিআর উভয়ের উপস্থিতি সম্পর্কিত বিবরণের জন্য নীচের অনুচ্ছেদটি পড়ুন।

এই ধরণেরগুলি সম্পর্কে প্রায়শই বিভ্রান্তি উপস্থিত থাকে; আশা করি এটা কাজে লাগবে. এগুলি সম্পর্কে কেন অফিসিয়াল ডকুমেন্টেশন নেই তা আমি সত্যিই জানি না। এছাড়াও, আমি কল্পনা করি যে আপনি উল্লেখ করেছেন এই ডাটাবেস অ্যাডাপ্টারগুলি একই ব্যক্তি লিখেছিলেন যা রেল লিখেছিল, সুতরাং অ্যাডাপ্টারগুলি লেখার সময় তাদের সম্ভবত কোনও ডকুমেন্টেশন প্রয়োজন হয়নি। আশাকরি এটা সাহায্য করবে!

দ্রষ্টব্য: উভয়ের উপস্থিতি :DateTimeএবং :Timestamp, যা আমি খুঁজে পেতে পারি তার মধ্যে বেশিরভাগ ডাটাবেস সিস্টেমের সাথে সামঞ্জস্যের জন্য রেলগুলি অন্তর্ভুক্ত করে। উদাহরণস্বরূপ, মাইএসকিউএল এর TIMESTAMPডেটাটাইপটি ইউনিক্স টাইমস্ট্যাম্প হিসাবে সঞ্চিত। এর বৈধ পরিসরটি ১৯ 1970০ থেকে ২০৩৮ সাল পর্যন্ত চলেছে এবং সময়টি শেষ যুগের পর থেকে যে পরিমাণ সেকেন্ড পেরিয়ে গেছে তা হিসাবে সংরক্ষণ করা হয় , যা অনুমিতভাবে স্ট্যান্ডার্ড, তবে বাস্তবে এটি সিস্টেম থেকে সিস্টেমে পৃথক হতে পারে। ডেটাবেসগুলিতে আপেক্ষিক সময় রাখা ভাল জিনিস নয় তা স্বীকৃতি দিয়ে মাইএসকিউএল পরে ডেটাটাইপটি পিছনের দিকের সামঞ্জস্যের জন্য ধরে রাখা হয়েছিল। অন্যান্য ডাটাবেস সিস্টেম একই বিবর্তন পেরিয়ে গেছে। রেলগুলি স্বীকৃতি দিয়েছে যে একাধিক মান বিদ্যমান এবং উভয়ের জন্য ইন্টারফেস সরবরাহ করেছে to যাইহোক, পাগল ActiveRecord অক্ষমতা উভয় এবংDATETIME ডেটাটাইপ , যা বছর, মাস, দিন, ঘন্টা, মিনিট এবং সেকেন্ডে প্রতিটি অঙ্কের আকার বৃদ্ধির ব্যয়ে সঞ্চয় করে। দ্যTIMESTAMP:Timestamp:DateTime তে সঞ্চিত ইউটিসি তারিখের জন্যDATETIME , তাই এটি রেল প্রোগ্রামারগুলিতে কোনও কার্যকরী পার্থক্য করে না। এগুলির উপস্থিতি যাতে ব্যবহারকারীদের চান এমন ব্যবহারকারীরাদু'জনের মধ্যে পার্থক্য করা তাই করতে পারে। (আরও গভীরতর ব্যাখ্যার জন্য, এই এসও উত্তরটি দেখুন)।


21
এটি একটি দুর্দান্ত রেকআপ, @ আগুয়াজালস। এটি বিশাল পর্যবেক্ষণের মতো বলে মনে হচ্ছে যে রেল ডকুমেন্টেশনের কিছু নেই।
গ্রান্ট বার্চমিয়ার

ধন্যবাদ :) এবং আমি সম্পূর্ণরূপে একমত, অ্যাক্টিভেকর্ড এবং এর ডেটাটাইপগুলি রেলগুলির পক্ষে এত গুরুত্বপূর্ণ, কেন এটি স্ট্যান্ডার্ড ডকুমেন্টেশন নয় id
আগুয়াজল

2
পাঠ্যটি সর্বদা সীমাহীন দৈর্ঘ্য নয় - মাইএসকিউএলে এটি প্রায় 16 কেবি সীমাবদ্ধ। আপনার যদি 16kb এর বেশি প্রয়োজন হয় তবে মিডিয়ামটেক্সট এবং লংটেক্সট ডাটাবেস প্রকার রয়েছে।
হাইগিন

3
এটি একটি ভাল উত্স রইলগুলি মাইগ্রেশন ডেটা প্রকার - মাইএসকিএল - পোস্টগ্র্যাস্কল - এসকিউএলাইট । আমি জানি এটি ডাটাবেস নির্দিষ্ট; তবে রেল ডাটাবেসের ধরণগুলি বোঝার সময় প্রকৃত বাস্তবায়ন জেনে রাখা এখনও সহায়ক।
নট

1
আমি 100% নিশ্চিত হতে পারি না, তবে আমার মনে হয় নেটের সংস্থান এখানে পোস্ট করা হয়েছিল ।
আগুয়াজলেস

10

রেল মাস্টার শাখার উত্স কোড থেকে আমি পেয়েছি:

বিমূর্ত mysql_adapter

#activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb

  NATIVE_DATABASE_TYPES = {
    primary_key: "bigint auto_increment PRIMARY KEY",
    string:      { name: "varchar", limit: 255 },
    text:        { name: "text", limit: 65535 },
    integer:     { name: "int", limit: 4 },
    float:       { name: "float" },
    decimal:     { name: "decimal" },
    datetime:    { name: "datetime" },
    timestamp:   { name: "timestamp" },
    time:        { name: "time" },
    date:        { name: "date" },
    binary:      { name: "blob", limit: 65535 },
    boolean:     { name: "tinyint", limit: 1 },
    json:        { name: "json" },
  }

  # Maps logical Rails types to MySQL-specific data types.
  def type_to_sql(type, limit = nil, precision = nil, scale = nil, unsigned = nil)
    sql = case type.to_s
    when 'integer'
      integer_to_sql(limit)
    when 'text'
      text_to_sql(limit)
    when 'blob'
      binary_to_sql(limit)
    when 'binary'
      if (0..0xfff) === limit
        "varbinary(#{limit})"
      else
        binary_to_sql(limit)
      end
    else
      super(type, limit, precision, scale)
    end

    sql << ' unsigned' if unsigned && type != :primary_key
    sql
  end    

# and integer ...

  def integer_to_sql(limit) # :nodoc:
    case limit
    when 1; 'tinyint'
    when 2; 'smallint'
    when 3; 'mediumint'
    when nil, 4; 'int'
    when 5..8; 'bigint'
    else raise(ActiveRecordError, "No integer type has byte size #{limit}")
    end
  end

 # and text ..

  def text_to_sql(limit) # :nodoc:
    case limit
    when 0..0xff;               'tinytext'
    when nil, 0x100..0xffff;    'text'
    when 0x10000..0xffffff;     'mediumtext'
    when 0x1000000..0xffffffff; 'longtext'
    else raise(ActiveRecordError, "No text type has byte length #{limit}")
    end
  end

# and binary ...

    def binary_to_sql(limit) # :nodoc:
      case limit
      when 0..0xff;               "tinyblob"
      when nil, 0x100..0xffff;    "blob"
      when 0x10000..0xffffff;     "mediumblob"
      when 0x1000000..0xffffffff; "longblob"
      else raise(ActiveRecordError, "No binary type has byte length #{limit}")
      end
    end

superমধ্যে type_to_sqlপদ্ধতি

#activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
  def type_to_sql(type, limit = nil, precision = nil, scale = nil) #:nodoc:
    type = type.to_sym if type
    if native = native_database_types[type]
      column_type_sql = (native.is_a?(Hash) ? native[:name] : native).dup

      if type == :decimal # ignore limit, use precision and scale
        scale ||= native[:scale]

        if precision ||= native[:precision]
          if scale
            column_type_sql << "(#{precision},#{scale})"
          else
            column_type_sql << "(#{precision})"
          end
        elsif scale
          raise ArgumentError, "Error adding decimal column: precision cannot be empty if scale is specified"
        end

      elsif [:datetime, :time].include?(type) && precision ||= native[:precision]
        if (0..6) === precision
          column_type_sql << "(#{precision})"
        else
          raise(ActiveRecordError, "No #{native[:name]} type has precision of #{precision}. The allowed range of precision is from 0 to 6")
        end
      elsif (type != :primary_key) && (limit ||= native.is_a?(Hash) && native[:limit])
        column_type_sql << "(#{limit})"
      end

      column_type_sql
    else
      type.to_s
    end
  end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.