I actually just started working on a learning project involving exactly this, as part of an inventory tracking system for my pantry.
Question 1:
We have a recipe, which contains many ingredients, many directions, and various other properties such as servings, cook time, etc. The ingredients are their own table(model) in the database, and they reference (in my application, I don't know this is relevant to you) an item that exists in my pantry. Here are the basic thrusts of my models:
class Recipe < ActiveRecord::Base
####################
# Database Rows:
# id -> integer
# name -> string
# description -> string
# directions -> serialized string, array
# servings -> integer
serialize :directions
# Relations
has_many :ingredients
end
For me, working with the directions as an array of strings is the most straightforward solution. ActiveModel will store the entire array as a single string in a single column, and using the serialize helper method, it gets converted into an array inside the application. I'm not sure if you're using Rails, so this may not be helpful.
class Ingredient < ActiveRecord::Base
######################
# Database Rows:
# id -> integer
# quantity -> decimal
# measurement -> string
# inventory_id -> integer
# Relations
belongs_to :recipe
has_one :inventory
end
More pointedly, in the database, there are tables "recipes" and "ingredients". A single recipe will reference many rows in the ingredients table. The recipe stores the list of ingredients that it contains.
Question 2:
According to this, we are looking at 8,000 byte limit for string columns. Will this be enough for your needs? You decide. If you think that's too small for the description, you can change the row type. You could store the directions in a separate table so that each individual direction has the 8,000 byte limit. Those are long directions, though...
My project is here, if you wanna poke around or anything. It's still in progress.